@sylvesterllc/aws-constructs 1.1.25 → 1.1.27

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.
@@ -9,7 +9,7 @@ exports.config = {
9
9
  name: `${process.env.APP_NAME}`,
10
10
  accountNumber: process.env.CDK_DEFAULT_ACCOUNT || "",
11
11
  region: process.env.CDK_DEFAULT_REGION || "us-east-1",
12
- stackRuntime: aws_lambda_1.Runtime.NODEJS_22_X,
12
+ stackRuntime: aws_lambda_1.Runtime.NODEJS_LATEST,
13
13
  },
14
14
  API: {
15
15
  Name: `${process.env.APP_NAME}-auth-api`,
@@ -79,4 +79,4 @@ exports.config = {
79
79
  FQDN: ''
80
80
  }
81
81
  };
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9TZXJ2aWNlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9taWNyb1NlcnZpY2VDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQXNGO0FBQ3RGLHVEQUFpRDtBQUNqRCwyQ0FBd0M7QUFHM0IsUUFBQSxNQUFNLEdBQWU7SUFDOUIsT0FBTyxFQUFFO1FBQ0wsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7UUFDL0IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksRUFBRTtRQUNwRCxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxXQUFXO1FBQ3JELFlBQVksRUFBRSxvQkFBTyxDQUFDLFdBQVc7S0FDcEM7SUFDRCxHQUFHLEVBQUU7UUFDRCxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsV0FBVztRQUN4QyxXQUFXLEVBQUUsb0JBQW9CO1FBQ2pDLFlBQVksRUFBRSxlQUFlO0tBQ2hDO0lBQ0QsU0FBUyxFQUFFO1FBQ1AsTUFBTSxFQUFFO1lBQ0o7Z0JBQ0ksSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsUUFBUSxFQUFFLDBDQUEwQztnQkFDcEQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsVUFBVSxFQUFFO29CQUNSLEtBQUssRUFBRSx5QkFBeUI7b0JBQ2hDLE1BQU0sRUFBRSxNQUFNO2lCQUNqQjthQUVKO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsUUFBUSxFQUFFLDJDQUEyQztnQkFDckQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsVUFBVSxFQUFFO29CQUNSLEtBQUssRUFBRSwwQkFBMEI7b0JBQ2pDLE1BQU0sRUFBRSxNQUFNO29CQUNkLE9BQU8sRUFBRSxDQUFDO2lCQUNiO2FBQ0o7U0FDSjtRQUVELE1BQU0sRUFBRTtZQUNKLE1BQU0sRUFBRTtnQkFDSjtvQkFDSSxTQUFTLEVBQUUsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO29CQUNqRSxVQUFVLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTtxQkFDN0I7b0JBQ0QsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtvQkFDeEMsT0FBTyxFQUFFO3dCQUNMOzRCQUNJLFNBQVMsRUFBRSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJOzRCQUNsRixZQUFZLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFdBQVc7Z0NBQ2pCLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07NkJBQzdCOzRCQUNELGNBQWMsRUFBRSw2QkFBYyxDQUFDLEdBQUc7eUJBQ3JDO3dCQUNEOzRCQUNJLFNBQVMsRUFBRSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJOzRCQUM3RSxZQUFZLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07NkJBQzdCOzRCQUNELGNBQWMsRUFBRSw2QkFBYyxDQUFDLEdBQUc7eUJBQ3JDO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtLQUVKO0lBQ0QsR0FBRyxFQUFFO1FBQ0QsUUFBUSxFQUFFLEVBQUU7UUFDWixNQUFNLEVBQUUsRUFBRTtRQUNWLHFCQUFxQixFQUFFLFVBQVU7UUFDakMscUJBQXFCLEVBQUUsVUFBVTtRQUNqQyxTQUFTLEVBQUUsSUFBSTtRQUNmLFFBQVEsRUFBRSxFQUFFO1FBQ1osSUFBSSxFQUFFLEVBQUU7S0FFWDtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGVUeXBlLCBCaWxsaW5nTW9kZSwgUHJvamVjdGlvblR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XHJcbmltcG9ydCB7IFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tIFwiLi9Db25zdGFudHNcIjtcclxuaW1wb3J0IHsgSUFwcENvbmZpZyB9IGZyb20gXCIuL2N1c3RvbUNvbmZpZ3MvSUFwcENvbmZpZ1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbmZpZzogSUFwcENvbmZpZyA9IHtcclxuICAgIEdMT0JBTFM6IHtcclxuICAgICAgICBuYW1lOiBgJHtwcm9jZXNzLmVudi5BUFBfTkFNRX1gLFxyXG4gICAgICAgIGFjY291bnROdW1iZXI6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfHwgXCJcIixcclxuICAgICAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB8fCBcInVzLWVhc3QtMVwiLFxyXG4gICAgICAgIHN0YWNrUnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcclxuICAgIH0sXHJcbiAgICBBUEk6IHtcclxuICAgICAgICBOYW1lOiBgJHtwcm9jZXNzLmVudi5BUFBfTkFNRX0tYXV0aC1hcGlgLFxyXG4gICAgICAgIERlc2NyaXB0aW9uOiAnVGhpcyBpcyBteSBuZXcgQVBJJyxcclxuICAgICAgICBEb21haW5QcmVmaXg6ICdteS1jdXN0b20tYXBpJ1xyXG4gICAgfSxcclxuICAgIFJFU09VUkNFUzoge1xyXG4gICAgICAgIExBTUJEQTogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgY3JlYXRlLWFjY291bnRgLFxyXG4gICAgICAgICAgICAgICAgY29kZVBhdGg6ICcuL2xhbWJkYS1mdW5jdGlvbnMvYXV0aC9jcmVhdGVBY2NvdW50LnRzJyxcclxuICAgICAgICAgICAgICAgIGhhbmRsZXI6ICdtYWluJyxcclxuICAgICAgICAgICAgICAgIGFwaUdhdGV3YXk6IHtcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZTogJy9hY2NvdW50L2NyZWF0ZS1hY2NvdW50JyxcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdwb3N0JywgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGBjaGFuZ2UtcGFzc3dvcmRgLFxyXG4gICAgICAgICAgICAgICAgY29kZVBhdGg6ICcuL2xhbWJkYS1mdW5jdGlvbnMvYXV0aC9jaGFuZ2VQYXNzd29yZC50cycsXHJcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAnbWFpbicsXHJcbiAgICAgICAgICAgICAgICBhcGlHYXRld2F5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm91dGU6ICcvYWNjb3VudC9jaGFuZ2UtcGFzc3dvcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246IDJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIFxyXG4gICAgICAgIERZTkFNTzoge1xyXG4gICAgICAgICAgICBUQUJMRVM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWU6IGAke0NPTlNUQU5UUy5EWU5BTU9EQi5UQUJMRVMuQVVUSF9ISVNUT1JZX1RBQkxFLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5S2V5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcclxuICAgICAgICAgICAgICAgICAgICBpbmRleGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TmFtZTogQ09OU1RBTlRTLkRZTkFNT0RCLlRBQkxFUy5BVVRIX0hJU1RPUllfVEFCTEUuaW5kZXhlcy5BdXRoSGlzdG9yeVRTLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY3JlYXRlZFRTJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBdHRyaWJ1dGVUeXBlLk5VTUJFUlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25UeXBlOiBQcm9qZWN0aW9uVHlwZS5BTExcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhOYW1lOiBDT05TVEFOVFMuRFlOQU1PREIuVEFCTEVTLkFVVEhfSElTVE9SWV9UQUJMRS5pbmRleGVzLlVzZXJuYW1lLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndXNlcm5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvblR5cGU6IFByb2plY3Rpb25UeXBlLkFMTFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICB9LFxyXG4gICAgRE5TOiB7XHJcbiAgICAgICAgWm9uZU5hbWU6ICcnLFxyXG4gICAgICAgIFpvbmVJZDogJycsXHJcbiAgICAgICAgWm9uZU5hbWVXaXRob3V0UGVyaW9kOiAnbm90LXVzZWQnLFxyXG4gICAgICAgIFpvbmVOYW1lV2l0aG91dFN1ZmZpeDogJ25vdC11c2VkJyxcclxuICAgICAgICBab25lRXhpc3Q6IHRydWUsXHJcbiAgICAgICAgSG9zdE5hbWU6ICcnLFxyXG4gICAgICAgIEZRRE46ICcnXHJcblxyXG4gICAgfVxyXG59OyAiXX0=
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9TZXJ2aWNlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9taWNyb1NlcnZpY2VDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQXNGO0FBQ3RGLHVEQUFpRDtBQUNqRCwyQ0FBd0M7QUFHM0IsUUFBQSxNQUFNLEdBQWU7SUFDOUIsT0FBTyxFQUFFO1FBQ0wsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7UUFDL0IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksRUFBRTtRQUNwRCxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxXQUFXO1FBQ3JELFlBQVksRUFBRSxvQkFBTyxDQUFDLGFBQWE7S0FDdEM7SUFDRCxHQUFHLEVBQUU7UUFDRCxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsV0FBVztRQUN4QyxXQUFXLEVBQUUsb0JBQW9CO1FBQ2pDLFlBQVksRUFBRSxlQUFlO0tBQ2hDO0lBQ0QsU0FBUyxFQUFFO1FBQ1AsTUFBTSxFQUFFO1lBQ0o7Z0JBQ0ksSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsUUFBUSxFQUFFLDBDQUEwQztnQkFDcEQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsVUFBVSxFQUFFO29CQUNSLEtBQUssRUFBRSx5QkFBeUI7b0JBQ2hDLE1BQU0sRUFBRSxNQUFNO2lCQUNqQjthQUVKO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsUUFBUSxFQUFFLDJDQUEyQztnQkFDckQsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsVUFBVSxFQUFFO29CQUNSLEtBQUssRUFBRSwwQkFBMEI7b0JBQ2pDLE1BQU0sRUFBRSxNQUFNO29CQUNkLE9BQU8sRUFBRSxDQUFDO2lCQUNiO2FBQ0o7U0FDSjtRQUVELE1BQU0sRUFBRTtZQUNKLE1BQU0sRUFBRTtnQkFDSjtvQkFDSSxTQUFTLEVBQUUsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO29CQUNqRSxVQUFVLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTtxQkFDN0I7b0JBQ0QsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtvQkFDeEMsT0FBTyxFQUFFO3dCQUNMOzRCQUNJLFNBQVMsRUFBRSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJOzRCQUNsRixZQUFZLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFdBQVc7Z0NBQ2pCLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07NkJBQzdCOzRCQUNELGNBQWMsRUFBRSw2QkFBYyxDQUFDLEdBQUc7eUJBQ3JDO3dCQUNEOzRCQUNJLFNBQVMsRUFBRSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJOzRCQUM3RSxZQUFZLEVBQUU7Z0NBQ1YsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU07NkJBQzdCOzRCQUNELGNBQWMsRUFBRSw2QkFBYyxDQUFDLEdBQUc7eUJBQ3JDO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtLQUVKO0lBQ0QsR0FBRyxFQUFFO1FBQ0QsUUFBUSxFQUFFLEVBQUU7UUFDWixNQUFNLEVBQUUsRUFBRTtRQUNWLHFCQUFxQixFQUFFLFVBQVU7UUFDakMscUJBQXFCLEVBQUUsVUFBVTtRQUNqQyxTQUFTLEVBQUUsSUFBSTtRQUNmLFFBQVEsRUFBRSxFQUFFO1FBQ1osSUFBSSxFQUFFLEVBQUU7S0FFWDtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGVUeXBlLCBCaWxsaW5nTW9kZSwgUHJvamVjdGlvblR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XHJcbmltcG9ydCB7IFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tIFwiLi9Db25zdGFudHNcIjtcclxuaW1wb3J0IHsgSUFwcENvbmZpZyB9IGZyb20gXCIuL2N1c3RvbUNvbmZpZ3MvSUFwcENvbmZpZ1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbmZpZzogSUFwcENvbmZpZyA9IHtcclxuICAgIEdMT0JBTFM6IHtcclxuICAgICAgICBuYW1lOiBgJHtwcm9jZXNzLmVudi5BUFBfTkFNRX1gLFxyXG4gICAgICAgIGFjY291bnROdW1iZXI6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfHwgXCJcIixcclxuICAgICAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB8fCBcInVzLWVhc3QtMVwiLFxyXG4gICAgICAgIHN0YWNrUnVudGltZTogUnVudGltZS5OT0RFSlNfTEFURVNULFxyXG4gICAgfSxcclxuICAgIEFQSToge1xyXG4gICAgICAgIE5hbWU6IGAke3Byb2Nlc3MuZW52LkFQUF9OQU1FfS1hdXRoLWFwaWAsXHJcbiAgICAgICAgRGVzY3JpcHRpb246ICdUaGlzIGlzIG15IG5ldyBBUEknLFxyXG4gICAgICAgIERvbWFpblByZWZpeDogJ215LWN1c3RvbS1hcGknXHJcbiAgICB9LFxyXG4gICAgUkVTT1VSQ0VTOiB7XHJcbiAgICAgICAgTEFNQkRBOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGBjcmVhdGUtYWNjb3VudGAsXHJcbiAgICAgICAgICAgICAgICBjb2RlUGF0aDogJy4vbGFtYmRhLWZ1bmN0aW9ucy9hdXRoL2NyZWF0ZUFjY291bnQudHMnLFxyXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogJ21haW4nLFxyXG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlOiAnL2FjY291bnQvY3JlYXRlLWFjY291bnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLCAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogYGNoYW5nZS1wYXNzd29yZGAsXHJcbiAgICAgICAgICAgICAgICBjb2RlUGF0aDogJy4vbGFtYmRhLWZ1bmN0aW9ucy9hdXRoL2NoYW5nZVBhc3N3b3JkLnRzJyxcclxuICAgICAgICAgICAgICAgIGhhbmRsZXI6ICdtYWluJyxcclxuICAgICAgICAgICAgICAgIGFwaUdhdGV3YXk6IHtcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZTogJy9hY2NvdW50L2NoYW5nZS1wYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAncG9zdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgXHJcbiAgICAgICAgRFlOQU1POiB7XHJcbiAgICAgICAgICAgIFRBQkxFUzogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZTogYCR7Q09OU1RBTlRTLkRZTkFNT0RCLlRBQkxFUy5BVVRIX0hJU1RPUllfVEFCTEUubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlLZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2lkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBiaWxsaW5nTW9kZTogQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhOYW1lOiBDT05TVEFOVFMuRFlOQU1PREIuVEFCTEVTLkFVVEhfSElTVE9SWV9UQUJMRS5pbmRleGVzLkF1dGhIaXN0b3J5VFMubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjcmVhdGVkVFMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0dHJpYnV0ZVR5cGUuTlVNQkVSXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvblR5cGU6IFByb2plY3Rpb25UeXBlLkFMTFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE5hbWU6IENPTlNUQU5UUy5EWU5BTU9EQi5UQUJMRVMuQVVUSF9ISVNUT1JZX1RBQkxFLmluZGV4ZXMuVXNlcm5hbWUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICd1c2VybmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uVHlwZTogUHJvamVjdGlvblR5cGUuQUxMXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG5cclxuICAgIH0sXHJcbiAgICBETlM6IHtcclxuICAgICAgICBab25lTmFtZTogJycsXHJcbiAgICAgICAgWm9uZUlkOiAnJyxcclxuICAgICAgICBab25lTmFtZVdpdGhvdXRQZXJpb2Q6ICdub3QtdXNlZCcsXHJcbiAgICAgICAgWm9uZU5hbWVXaXRob3V0U3VmZml4OiAnbm90LXVzZWQnLFxyXG4gICAgICAgIFpvbmVFeGlzdDogdHJ1ZSxcclxuICAgICAgICBIb3N0TmFtZTogJycsXHJcbiAgICAgICAgRlFETjogJydcclxuXHJcbiAgICB9XHJcbn07ICJdfQ==
@@ -5,8 +5,79 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
6
  const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
7
7
  const aws_logs_1 = require("aws-cdk-lib/aws-logs");
8
+ const fs = require("fs");
8
9
  const path = require("path");
9
10
  const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
11
+ const isSubPath = (root, target) => {
12
+ const relative = path.relative(path.resolve(root), path.resolve(target));
13
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
14
+ };
15
+ const LOCK_FILE_NAMES = ["pnpm-lock.yaml", "yarn.lock", "package-lock.json"];
16
+ const resolveProjectRoot = (projectRoot) => {
17
+ if (!projectRoot) {
18
+ return undefined;
19
+ }
20
+ return path.isAbsolute(projectRoot)
21
+ ? path.resolve(projectRoot)
22
+ : path.resolve(process.cwd(), projectRoot);
23
+ };
24
+ const findNearestLockFile = (startDir) => {
25
+ let current = path.resolve(startDir);
26
+ const { root } = path.parse(current);
27
+ while (true) {
28
+ for (const candidate of LOCK_FILE_NAMES) {
29
+ const resolvedCandidate = path.join(current, candidate);
30
+ if (fs.existsSync(resolvedCandidate) && fs.statSync(resolvedCandidate).isFile()) {
31
+ return resolvedCandidate;
32
+ }
33
+ }
34
+ if (current === root) {
35
+ return undefined;
36
+ }
37
+ current = path.dirname(current);
38
+ }
39
+ };
40
+ const findCommonAncestor = (paths) => {
41
+ if (paths.length === 0) {
42
+ return undefined;
43
+ }
44
+ let ancestor = path.resolve(paths[0]);
45
+ for (const currentPath of paths.slice(1)) {
46
+ const target = path.resolve(currentPath);
47
+ const ancestorRoot = path.parse(ancestor).root;
48
+ if (path.parse(ancestor).root.toLowerCase() !== path.parse(target).root.toLowerCase()) {
49
+ return undefined;
50
+ }
51
+ let candidate = ancestor;
52
+ while (!isSubPath(candidate, target)) {
53
+ if (candidate === ancestorRoot) {
54
+ candidate = ancestorRoot;
55
+ break;
56
+ }
57
+ candidate = path.dirname(candidate);
58
+ }
59
+ ancestor = candidate;
60
+ }
61
+ return ancestor;
62
+ };
63
+ const resolvePath = (inputPath, projectRoot) => {
64
+ if (path.isAbsolute(inputPath)) {
65
+ return path.resolve(inputPath);
66
+ }
67
+ const candidates = [];
68
+ if (projectRoot) {
69
+ candidates.push(path.resolve(projectRoot, inputPath));
70
+ }
71
+ candidates.push(path.resolve(process.cwd(), inputPath));
72
+ if (projectRoot) {
73
+ for (const candidate of candidates) {
74
+ if (isSubPath(projectRoot, candidate)) {
75
+ return candidate;
76
+ }
77
+ }
78
+ }
79
+ return candidates[candidates.length - 1];
80
+ };
10
81
  const createBasicLambda = (scope, props) => {
11
82
  const lambdaProps = createBasicLambdaProps(props);
12
83
  let lambdaFunction = new aws_lambda_nodejs_1.NodejsFunction(scope, `${props.appPrefix || ""}${props.functionName}`, lambdaProps);
@@ -16,26 +87,44 @@ const createBasicLambda = (scope, props) => {
16
87
  };
17
88
  exports.createBasicLambda = createBasicLambda;
18
89
  const createBasicLambdaProps = (props) => {
19
- let resolvedEntry;
20
- if (props.codePath && path.isAbsolute(props.codePath)) {
21
- resolvedEntry = props.codePath;
22
- }
23
- else if (props.codePath && props.projectRoot) {
24
- // codePath is relative, resolve from current directory + projectRoot
25
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
90
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
91
+ const defaultRelativeEntry = path.join("resources", "lambdas", props.functionName, "main.mts");
92
+ const entryPath = props.codePath ?? defaultRelativeEntry;
93
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
94
+ const cwd = path.resolve(process.cwd());
95
+ const entryDir = path.dirname(resolvedEntry);
96
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
97
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
98
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
99
+ if (!ancestor) {
100
+ throw new Error(`Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`);
101
+ }
102
+ effectiveProjectRoot = ancestor;
26
103
  }
27
- else if (props.projectRoot) {
28
- // No codePath, use default path with projectRoot
29
- resolvedEntry = path.resolve(process.cwd(), props.projectRoot, `resources/lambdas/${props.functionName}/main.mts`);
104
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
105
+ throw new Error(`Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`);
30
106
  }
31
- else if (props.codePath) {
32
- // codePath without projectRoot
33
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
107
+ let resolvedDepsLockFilePath = props.depsLockFilePath
108
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
109
+ : undefined;
110
+ if (!resolvedDepsLockFilePath) {
111
+ const potentialLockFiles = [
112
+ findNearestLockFile(entryDir),
113
+ findNearestLockFile(cwd),
114
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
115
+ ];
116
+ for (const lockFile of potentialLockFiles) {
117
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
118
+ resolvedDepsLockFilePath = lockFile;
119
+ break;
120
+ }
121
+ }
34
122
  }
35
- else {
36
- // Default path without projectRoot
37
- resolvedEntry = path.join(`./resources/lambdas/${props.functionName}/main.mts`);
123
+ if (resolvedDepsLockFilePath &&
124
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)) {
125
+ throw new Error(`Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`);
38
126
  }
127
+ const environmentVars = props.envs ?? {};
39
128
  const lambdaProp = {
40
129
  entry: resolvedEntry,
41
130
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${props.functionName}`,
@@ -45,7 +134,7 @@ const createBasicLambdaProps = (props) => {
45
134
  timeout: aws_cdk_lib_1.Duration.minutes(props.timeoutInMinutes ? props.timeoutInMinutes : 1),
46
135
  memorySize: props.memory,
47
136
  environment: {
48
- ...props.envs,
137
+ ...environmentVars,
49
138
  },
50
139
  bundling: {
51
140
  minify: true,
@@ -53,15 +142,15 @@ const createBasicLambdaProps = (props) => {
53
142
  sourceMap: true,
54
143
  sourceMapMode: aws_lambda_nodejs_1.SourceMapMode.EXTERNAL,
55
144
  environment: {
56
- ...props.envs,
145
+ ...environmentVars,
57
146
  },
58
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
59
- ...(props.depsLockFilePath && {
60
- depsLockFilePath: props.depsLockFilePath,
61
- }),
62
147
  },
63
148
  role: props.role,
64
149
  layers: undefined,
150
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
151
+ ...(resolvedDepsLockFilePath && {
152
+ depsLockFilePath: resolvedDepsLockFilePath,
153
+ }),
65
154
  };
66
155
  return lambdaProp;
67
156
  };
@@ -81,4 +170,4 @@ const addLambdaLayers = (scope, lambda, layerArns) => {
81
170
  });
82
171
  }
83
172
  };
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL2xhbWJkYS9jcmVhdGUtYmFzaWMtbGFtYmRhLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFFdkMsdURBQStEO0FBQy9ELHFFQUl1QztBQUN2QyxtREFBcUQ7QUFDckQsNkJBQThCO0FBRzlCLDJEQUFpRDtBQUUxQyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLEtBQWdCLEVBQ2hCLEtBQWtCLEVBQ0YsRUFBRTtJQUNsQixNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVsRCxJQUFJLGNBQWMsR0FBRyxJQUFJLGtDQUFjLENBQ3JDLEtBQUssRUFDTCxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFDL0MsV0FBVyxDQUNaLENBQUM7SUFFRix5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXpFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU3RCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDLENBQUM7QUFqQlcsUUFBQSxpQkFBaUIscUJBaUI1QjtBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFrQixFQUF1QixFQUFFO0lBQ3pFLElBQUksYUFBcUIsQ0FBQztJQUUxQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFX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QixTQUFvQixFQUNwQixFQUFFO0lBQ0YsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLHlCQUFZLENBQUMsbUJBQW1CLENBQzVDLEtBQUssRUFDTCxnQkFBZ0IsR0FBRyxFQUFFLEVBQ3JCLEdBQUcsQ0FDSixDQUFDO1lBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcclxuaW1wb3J0IHsgTGF5ZXJWZXJzaW9uLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcclxuaW1wb3J0IHtcclxuICBOb2RlanNGdW5jdGlvbixcclxuICBOb2RlanNGdW5jdGlvblByb3BzLFxyXG4gIFNvdXJjZU1hcE1vZGUsXHJcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XHJcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcclxuaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuaW1wb3J0IHsgTGFtYmRhUHJvcHMgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9sYW1iZGFcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzaWNMYW1iZGEgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBwcm9wczogTGFtYmRhUHJvcHNcclxuKTogTm9kZWpzRnVuY3Rpb24gPT4ge1xyXG4gIGNvbnN0IGxhbWJkYVByb3BzID0gY3JlYXRlQmFzaWNMYW1iZGFQcm9wcyhwcm9wcyk7XHJcblxyXG4gIGxldCBsYW1iZGFGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbihcclxuICAgIHNjb3BlLFxyXG4gICAgYCR7cHJvcHMuYXBwUHJlZml4IHx8IFwiXCJ9JHtwcm9wcy5mdW5jdGlvbk5hbWV9YCxcclxuICAgIGxhbWJkYVByb3BzXHJcbiAgKTtcclxuXHJcbiAgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyhzY29wZSwgbGFtYmRhRnVuY3Rpb24sIHByb3BzLmR5bmFtb1RhYmxlTmFtZXMpO1xyXG5cclxuICBhZGRMYW1iZGFMYXllcnMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5sYW1iZGFMYXllckFybik7XHJcblxyXG4gIHJldHVybiBsYW1iZGFGdW5jdGlvbjtcclxufTtcclxuXHJcbmNvbnN0IGNyZWF0ZUJhc2ljTGFtYmRhUHJvcHMgPSAocHJvcHM6IExhbWJkYVByb3BzKTogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9PiB7XHJcbiAgbGV0IHJlc29sdmVkRW50cnk6IHN0cmluZztcclxuXHJcbiAgaWYgKHByb3BzLmNvZGVQYXRoICYmIHBhdGguaXNBYnNvbHV0ZShwcm9wcy5jb2RlUGF0aCkpIHtcclxuICAgIHJlc29sdmVkRW50cnkgPSBwcm9wcy5jb2RlUGF0aDtcclxuICB9IGVsc2UgaWYgKHByb3BzLmNvZGVQYXRoICYmIHByb3BzLnByb2plY3RSb290KSB7XHJcbiAgICAvLyBjb2RlUGF0aCBpcyByZWxhdGl2ZSwgcmVzb2x2ZSBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5ICsgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvcHMuY29kZVBhdGgpO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMucHJvamVjdFJvb3QpIHtcclxuICAgIC8vIE5vIGNvZGVQYXRoLCB1c2UgZGVmYXVsdCBwYXRoIHdpdGggcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUoXHJcbiAgICAgIHByb2Nlc3MuY3dkKCksXHJcbiAgICAgIHByb3BzLnByb2plY3RSb290LFxyXG4gICAgICBgcmVzb3VyY2VzL2xhbWJkYXMvJHtwcm9wcy5mdW5jdGlvbk5hbWV9L21haW4ubXRzYFxyXG4gICAgKTtcclxuICB9IGVsc2UgaWYgKHByb3BzLmNvZGVQYXRoKSB7XHJcbiAgICAvLyBjb2RlUGF0aCB3aXRob3V0IHByb2plY3RSb290XHJcbiAgICByZXNvbHZlZEVudHJ5ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHByb3BzLmNvZGVQYXRoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gRGVmYXVsdCBwYXRoIHdpdGhvdXQgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLmpvaW4oXHJcbiAgICAgIGAuL3Jlc291cmNlcy9sYW1iZGFzLyR7cHJvcHMuZnVuY3Rpb25OYW1lfS9tYWluLm10c2BcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBsYW1iZGFQcm9wOiBOb2RlanNGdW5jdGlvblByb3BzID0ge1xyXG4gICAgZW50cnk6IHJlc29sdmVkRW50cnksXHJcbiAgICBmdW5jdGlvbk5hbWU6IGAke3Byb3BzLmFwcFByZWZpeCA/IGAke3Byb3BzLmFwcFByZWZpeH0tYCA6IFwiXCJ9JHtcclxuICAgICAgcHJvcHMuZnVuY3Rpb25OYW1lXHJcbiAgICB9YCxcclxuICAgIGhhbmRsZXI6IFwibWFpbi50c1wiLFxyXG4gICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcclxuICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTX0xBVEVTVCxcclxuICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoXHJcbiAgICAgIHByb3BzLnRpbWVvdXRJbk1pbnV0ZXMgPyBwcm9wcy50aW1lb3V0SW5NaW51dGVzIDogMVxyXG4gICAgKSxcclxuICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeSxcclxuICAgIGVudmlyb25tZW50OiB7XHJcbiAgICAgIC4uLnByb3BzLmVudnMsXHJcbiAgICB9LFxyXG4gICAgYnVuZGxpbmc6IHtcclxuICAgICAgbWluaWZ5OiB0cnVlLFxyXG4gICAgICB0YXJnZXQ6IGBlc25leHRgLFxyXG4gICAgICBzb3VyY2VNYXA6IHRydWUsXHJcbiAgICAgIHNvdXJjZU1hcE1vZGU6IFNvdXJjZU1hcE1vZGUuRVhURVJOQUwsXHJcbiAgICAgIGVudmlyb25tZW50OiB7XHJcbiAgICAgICAgLi4ucHJvcHMuZW52cyxcclxuICAgICAgfSxcclxuICAgICAgLi4uKHByb3BzLnByb2plY3RSb290ICYmIHsgcHJvamVjdFJvb3Q6IHByb3BzLnByb2plY3RSb290IH0pLFxyXG4gICAgICAuLi4ocHJvcHMuZGVwc0xvY2tGaWxlUGF0aCAmJiB7XHJcbiAgICAgICAgZGVwc0xvY2tGaWxlUGF0aDogcHJvcHMuZGVwc0xvY2tGaWxlUGF0aCxcclxuICAgICAgfSksXHJcbiAgICB9LFxyXG4gICAgcm9sZTogcHJvcHMucm9sZSxcclxuICAgIGxheWVyczogdW5kZWZpbmVkLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBsYW1iZGFQcm9wO1xyXG59O1xyXG5cclxuY29uc3QgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgdGFibGVOYW1lcz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmICh0YWJsZU5hbWVzICYmIHRhYmxlTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgdGFibGVOYW1lcy5mb3JFYWNoKCh0YWJsZU5hbWUpID0+IHtcclxuICAgICAgY29uc3QgdGFibGUgPSBUYWJsZS5mcm9tVGFibGVOYW1lKHNjb3BlLCBgJHt0YWJsZU5hbWV9LXRhYmxlYCwgdGFibGVOYW1lKTtcclxuXHJcbiAgICAgIHRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYWRkTGFtYmRhTGF5ZXJzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICBsYXllckFybnM/OiBzdHJpbmdbXVxyXG4pID0+IHtcclxuICBpZiAobGF5ZXJBcm5zICYmIGxheWVyQXJucy5sZW5ndGggPiAwKSB7XHJcbiAgICBsYXllckFybnMuZm9yRWFjaCgoYXJuOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXHJcbiAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgYGNvbW1vbi1sYXllci0ke2lkeH1gLFxyXG4gICAgICAgIGFyblxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGFtYmRhLmFkZExheWVycyhsYXllcik7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ==
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL2xhbWJkYS9jcmVhdGUtYmFzaWMtbGFtYmRhLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFFdkMsdURBQStEO0FBQy9ELHFFQUl1QztBQUN2QyxtREFBcUQ7QUFDckQseUJBQTBCO0FBQzFCLDZCQUE4QjtBQUc5QiwyREFBaUQ7QUFFakQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsTUFBYyxFQUFXLEVBQUU7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RSxPQUFPLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDdkYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztBQUU3RSxNQUFNLGtCQUFrQixHQUFHLENBQUMsV0FBb0IsRUFBc0IsRUFBRTtJQUN0RSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMv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LENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLHlCQUFZLENBQUMsbUJBQW1CLENBQzVDLEtBQUssRUFDTCxnQkFBZ0IsR0FBRyxFQUFFLEVBQ3JCLEdBQUcsQ0FDSixDQUFDO1lBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcclxuaW1wb3J0IHsgTGF5ZXJWZXJzaW9uLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcclxuaW1wb3J0IHtcclxuICBOb2RlanNGdW5jdGlvbixcclxuICBOb2RlanNGdW5jdGlvblByb3BzLFxyXG4gIFNvdXJjZU1hcE1vZGUsXHJcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XHJcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcclxuaW1wb3J0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5pbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5pbXBvcnQgeyBMYW1iZGFQcm9wcyB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2xhbWJkYVwiO1xyXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcclxuXHJcbmNvbnN0IGlzU3ViUGF0aCA9IChyb290OiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShyb290KSwgcGF0aC5yZXNvbHZlKHRhcmdldCkpO1xyXG4gIHJldHVybiByZWxhdGl2ZSA9PT0gXCJcIiB8fCAoIXJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuLlwiKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSk7XHJcbn07XHJcblxyXG5jb25zdCBMT0NLX0ZJTEVfTkFNRVMgPSBbXCJwbnBtLWxvY2sueWFtbFwiLCBcInlhcm4ubG9ja1wiLCBcInBhY2thZ2UtbG9jay5qc29uXCJdO1xyXG5cclxuY29uc3QgcmVzb2x2ZVByb2plY3RSb290ID0gKHByb2plY3RSb290Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICBpZiAoIXByb2plY3RSb290KSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShwcm9qZWN0Um9vdClcclxuICAgID8gcGF0aC5yZXNvbHZlKHByb2plY3RSb290KVxyXG4gICAgOiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvamVjdFJvb3QpO1xyXG59O1xyXG5cclxuY29uc3QgZmluZE5lYXJlc3RMb2NrRmlsZSA9IChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICBsZXQgY3VycmVudCA9IHBhdGgucmVzb2x2ZShzdGFydERpcik7XHJcbiAgY29uc3QgeyByb290IH0gPSBwYXRoLnBhcnNlKGN1cnJlbnQpO1xyXG5cclxuICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgTE9DS19GSUxFX05BTUVTKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnQsIGNhbmRpZGF0ZSk7XHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHJlc29sdmVkQ2FuZGlkYXRlKSAmJiBmcy5zdGF0U3luYyhyZXNvbHZlZENhbmRpZGF0ZSkuaXNGaWxlKCkpIHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRDYW5kaWRhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3VycmVudCA9PT0gcm9vdCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZmluZENvbW1vbkFuY2VzdG9yID0gKHBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XHJcbiAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGxldCBhbmNlc3RvciA9IHBhdGgucmVzb2x2ZShwYXRoc1swXSk7XHJcblxyXG4gIGZvciAoY29uc3QgY3VycmVudFBhdGggb2YgcGF0aHMuc2xpY2UoMSkpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IHBhdGgucmVzb2x2ZShjdXJyZW50UGF0aCk7XHJcbiAgICBjb25zdCBhbmNlc3RvclJvb3QgPSBwYXRoLnBhcnNlKGFuY2VzdG9yKS5yb290O1xyXG5cclxuICAgIGlmIChwYXRoLnBhcnNlKGFuY2VzdG9yKS5yb290LnRvTG93ZXJDYXNlKCkgIT09IHBhdGgucGFyc2UodGFyZ2V0KS5yb290LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2FuZGlkYXRlID0gYW5jZXN0b3I7XHJcbiAgICB3aGlsZSAoIWlzU3ViUGF0aChjYW5kaWRhdGUsIHRhcmdldCkpIHtcclxuICAgICAgaWYgKGNhbmRpZGF0ZSA9PT0gYW5jZXN0b3JSb290KSB7XHJcbiAgICAgICAgY2FuZGlkYXRlID0gYW5jZXN0b3JSb290O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhbmRpZGF0ZSA9IHBhdGguZGlybmFtZShjYW5kaWRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFuY2VzdG9yID0gY2FuZGlkYXRlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGFuY2VzdG9yO1xyXG59O1xyXG5cclxuY29uc3QgcmVzb2x2ZVBhdGggPSAoaW5wdXRQYXRoOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAocGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCkpIHtcclxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoaW5wdXRQYXRoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgaWYgKHByb2plY3RSb290KSB7XHJcbiAgICBjYW5kaWRhdGVzLnB1c2gocGF0aC5yZXNvbHZlKHByb2plY3RSb290LCBpbnB1dFBhdGgpKTtcclxuICB9XHJcbiAgY2FuZGlkYXRlcy5wdXNoKHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dFBhdGgpKTtcclxuXHJcbiAgaWYgKHByb2plY3RSb290KSB7XHJcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XHJcbiAgICAgIGlmIChpc1N1YlBhdGgocHJvamVjdFJvb3QsIGNhbmRpZGF0ZSkpIHtcclxuICAgICAgICByZXR1cm4gY2FuZGlkYXRlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2FuZGlkYXRlc1tjYW5kaWRhdGVzLmxlbmd0aCAtIDFdO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUJhc2ljTGFtYmRhID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgcHJvcHM6IExhbWJkYVByb3BzXHJcbik6IE5vZGVqc0Z1bmN0aW9uID0+IHtcclxuICBjb25zdCBsYW1iZGFQcm9wcyA9IGNyZWF0ZUJhc2ljTGFtYmRhUHJvcHMocHJvcHMpO1xyXG5cclxuICBsZXQgbGFtYmRhRnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24oXHJcbiAgICBzY29wZSxcclxuICAgIGAke3Byb3BzLmFwcFByZWZpeCB8fCBcIlwifSR7cHJvcHMuZnVuY3Rpb25OYW1lfWAsXHJcbiAgICBsYW1iZGFQcm9wc1xyXG4gICk7XHJcblxyXG4gIGdyYW50QWNjZXNzVG9EeW5hbW9UYWJsZXMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5keW5hbW9UYWJsZU5hbWVzKTtcclxuXHJcbiAgYWRkTGFtYmRhTGF5ZXJzKHNjb3BlLCBsYW1iZGFGdW5jdGlvbiwgcHJvcHMubGFtYmRhTGF5ZXJBcm4pO1xyXG5cclxuICByZXR1cm4gbGFtYmRhRnVuY3Rpb247XHJcbn07XHJcblxyXG5jb25zdCBjcmVhdGVCYXNpY0xhbWJkYVByb3BzID0gKHByb3BzOiBMYW1iZGFQcm9wcyk6IE5vZGVqc0Z1bmN0aW9uUHJvcHMgPT4ge1xyXG4gIGNvbnN0IHJlc29sdmVkUHJvamVjdFJvb3QgPSByZXNvbHZlUHJvamVjdFJvb3QocHJvcHMucHJvamVjdFJvb3QpO1xyXG4gIGNvbnN0IGRlZmF1bHRSZWxhdGl2ZUVudHJ5ID0gcGF0aC5qb2luKFxyXG4gICAgXCJyZXNvdXJjZXNcIixcclxuICAgIFwibGFtYmRhc1wiLFxyXG4gICAgcHJvcHMuZnVuY3Rpb25OYW1lLFxyXG4gICAgXCJtYWluLm10c1wiXHJcbiAgKTtcclxuICBjb25zdCBlbnRyeVBhdGggPSBwcm9wcy5jb2RlUGF0aCA/PyBkZWZhdWx0UmVsYXRpdmVFbnRyeTtcclxuICBjb25zdCByZXNvbHZlZEVudHJ5ID0gcmVzb2x2ZVBhdGgoZW50cnlQYXRoLCByZXNvbHZlZFByb2plY3RSb290KTtcclxuXHJcbiAgY29uc3QgY3dkID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpO1xyXG4gIGNvbnN0IGVudHJ5RGlyID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRW50cnkpO1xyXG5cclxuICBsZXQgZWZmZWN0aXZlUHJvamVjdFJvb3QgPSByZXNvbHZlZFByb2plY3RSb290ID8/IGN3ZDtcclxuICBpZiAoIWlzU3ViUGF0aChlZmZlY3RpdmVQcm9qZWN0Um9vdCwgcmVzb2x2ZWRFbnRyeSkpIHtcclxuICAgIGNvbnN0IGFuY2VzdG9yID0gZmluZENvbW1vbkFuY2VzdG9yKFtlZmZlY3RpdmVQcm9qZWN0Um9vdCwgZW50cnlEaXJdKTtcclxuICAgIGlmICghYW5jZXN0b3IpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBVbmFibGUgdG8gZGV0ZXJtaW5lIGEgcHJvamVjdFJvb3QgdGhhdCBjb250YWlucyBib3RoICR7ZWZmZWN0aXZlUHJvamVjdFJvb3R9IGFuZCAke3Jlc29sdmVkRW50cnl9LmBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVmZmVjdGl2ZVByb2plY3RSb290ID0gYW5jZXN0b3I7XHJcbiAgfVxyXG5cclxuICBpZiAoIWlzU3ViUGF0aChlZmZlY3RpdmVQcm9qZWN0Um9vdCwgcmVzb2x2ZWRFbnRyeSkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYFJlc29sdmVkIGxhbWJkYSBlbnRyeSAke3Jlc29sdmVkRW50cnl9IG11c3QgYmUgbG9jYXRlZCB3aXRoaW4gcHJvamVjdFJvb3QgJHtlZmZlY3RpdmVQcm9qZWN0Um9vdH0uYFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGxldCByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGggPSBwcm9wcy5kZXBzTG9ja0ZpbGVQYXRoXHJcbiAgICA/IHJlc29sdmVQYXRoKHByb3BzLmRlcHNMb2NrRmlsZVBhdGgsIHJlc29sdmVkUHJvamVjdFJvb3QpXHJcbiAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgaWYgKCFyZXNvbHZlZERlcHNMb2NrRmlsZVBhdGgpIHtcclxuICAgIGNvbnN0IHBvdGVudGlhbExvY2tGaWxlcyA9IFtcclxuICAgICAgZmluZE5lYXJlc3RMb2NrRmlsZShlbnRyeURpciksXHJcbiAgICAgIGZpbmROZWFyZXN0TG9ja0ZpbGUoY3dkKSxcclxuICAgICAgZWZmZWN0aXZlUHJvamVjdFJvb3QgIT09IGN3ZCA/IGZpbmROZWFyZXN0TG9ja0ZpbGUoZWZmZWN0aXZlUHJvamVjdFJvb3QpIDogdW5kZWZpbmVkLFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxvY2tGaWxlIG9mIHBvdGVudGlhbExvY2tGaWxlcykge1xyXG4gICAgICBpZiAobG9ja0ZpbGUgJiYgaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCBsb2NrRmlsZSkpIHtcclxuICAgICAgICByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGggPSBsb2NrRmlsZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgcmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRoICYmXHJcbiAgICAhaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGgpXHJcbiAgKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgIGBSZXNvbHZlZCBkZXBzTG9ja0ZpbGVQYXRoICR7cmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRofSBtdXN0IGJlIGxvY2F0ZWQgd2l0aGluIHByb2plY3RSb290ICR7ZWZmZWN0aXZlUHJvamVjdFJvb3R9LmBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBlbnZpcm9ubWVudFZhcnMgPSBwcm9wcy5lbnZzID8/IHt9O1xyXG5cclxuICBjb25zdCBsYW1iZGFQcm9wOiBOb2RlanNGdW5jdGlvblByb3BzID0ge1xyXG4gICAgZW50cnk6IHJlc29sdmVkRW50cnksXHJcbiAgICBmdW5jdGlvbk5hbWU6IGAke3Byb3BzLmFwcFByZWZpeCA/IGAke3Byb3BzLmFwcFByZWZpeH0tYCA6IFwiXCJ9JHtcclxuICAgICAgcHJvcHMuZnVuY3Rpb25OYW1lXHJcbiAgICB9YCxcclxuICAgIGhhbmRsZXI6IFwibWFpbi50c1wiLFxyXG4gICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcclxuICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTX0xBVEVTVCxcclxuICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoXHJcbiAgICAgIHByb3BzLnRpbWVvdXRJbk1pbnV0ZXMgPyBwcm9wcy50aW1lb3V0SW5NaW51dGVzIDogMVxyXG4gICAgKSxcclxuICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeSxcclxuICAgIGVudmlyb25tZW50OiB7XHJcbiAgICAgIC4uLmVudmlyb25tZW50VmFycyxcclxuICAgIH0sXHJcbiAgICBidW5kbGluZzoge1xyXG4gICAgICBtaW5pZnk6IHRydWUsXHJcbiAgICAgIHRhcmdldDogYGVzbmV4dGAsXHJcbiAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcclxuICAgICAgc291cmNlTWFwTW9kZTogU291cmNlTWFwTW9kZS5FWFRFUk5BTCxcclxuICAgICAgZW52aXJvbm1lbnQ6IHtcclxuICAgICAgICAuLi5lbnZpcm9ubWVudFZhcnMsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgcm9sZTogcHJvcHMucm9sZSxcclxuICAgIGxheWVyczogdW5kZWZpbmVkLFxyXG4gICAgLi4uKGVmZmVjdGl2ZVByb2plY3RSb290ICYmIHsgcHJvamVjdFJvb3Q6IGVmZmVjdGl2ZVByb2plY3RSb290IH0pLFxyXG4gICAgLi4uKHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCAmJiB7XHJcbiAgICAgIGRlcHNMb2NrRmlsZVBhdGg6IHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCxcclxuICAgIH0pLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBsYW1iZGFQcm9wO1xyXG59O1xyXG5cclxuY29uc3QgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgdGFibGVOYW1lcz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmICh0YWJsZU5hbWVzICYmIHRhYmxlTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgdGFibGVOYW1lcy5mb3JFYWNoKCh0YWJsZU5hbWUpID0+IHtcclxuICAgICAgY29uc3QgdGFibGUgPSBUYWJsZS5mcm9tVGFibGVOYW1lKHNjb3BlLCBgJHt0YWJsZU5hbWV9LXRhYmxlYCwgdGFibGVOYW1lKTtcclxuXHJcbiAgICAgIHRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYWRkTGFtYmRhTGF5ZXJzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICBsYXllckFybnM/OiBzdHJpbmdbXVxyXG4pID0+IHtcclxuICBpZiAobGF5ZXJBcm5zICYmIGxheWVyQXJucy5sZW5ndGggPiAwKSB7XHJcbiAgICBsYXllckFybnMuZm9yRWFjaCgoYXJuOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXHJcbiAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgYGNvbW1vbi1sYXllci0ke2lkeH1gLFxyXG4gICAgICAgIGFyblxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGFtYmRhLmFkZExheWVycyhsYXllcik7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ==
@@ -6,11 +6,82 @@ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
6
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
7
7
  const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
8
8
  const aws_logs_1 = require("aws-cdk-lib/aws-logs");
9
+ const fs = require("fs");
9
10
  const path = require("path");
10
11
  const aws_service_principal_constants_1 = require("../../constants/aws-service-principal-constants");
11
12
  const aws_events_1 = require("aws-cdk-lib/aws-events");
12
13
  const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
13
14
  const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
15
+ const isSubPath = (root, target) => {
16
+ const relative = path.relative(path.resolve(root), path.resolve(target));
17
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
18
+ };
19
+ const LOCK_FILE_NAMES = ["pnpm-lock.yaml", "yarn.lock", "package-lock.json"];
20
+ const resolveProjectRoot = (projectRoot) => {
21
+ if (!projectRoot) {
22
+ return undefined;
23
+ }
24
+ return path.isAbsolute(projectRoot)
25
+ ? path.resolve(projectRoot)
26
+ : path.resolve(process.cwd(), projectRoot);
27
+ };
28
+ const findNearestLockFile = (startDir) => {
29
+ let current = path.resolve(startDir);
30
+ const { root } = path.parse(current);
31
+ while (true) {
32
+ for (const candidate of LOCK_FILE_NAMES) {
33
+ const resolvedCandidate = path.join(current, candidate);
34
+ if (fs.existsSync(resolvedCandidate) && fs.statSync(resolvedCandidate).isFile()) {
35
+ return resolvedCandidate;
36
+ }
37
+ }
38
+ if (current === root) {
39
+ return undefined;
40
+ }
41
+ current = path.dirname(current);
42
+ }
43
+ };
44
+ const findCommonAncestor = (paths) => {
45
+ if (paths.length === 0) {
46
+ return undefined;
47
+ }
48
+ let ancestor = path.resolve(paths[0]);
49
+ for (const currentPath of paths.slice(1)) {
50
+ const target = path.resolve(currentPath);
51
+ const ancestorRoot = path.parse(ancestor).root;
52
+ if (path.parse(ancestor).root.toLowerCase() !== path.parse(target).root.toLowerCase()) {
53
+ return undefined;
54
+ }
55
+ let candidate = ancestor;
56
+ while (!isSubPath(candidate, target)) {
57
+ if (candidate === ancestorRoot) {
58
+ candidate = ancestorRoot;
59
+ break;
60
+ }
61
+ candidate = path.dirname(candidate);
62
+ }
63
+ ancestor = candidate;
64
+ }
65
+ return ancestor;
66
+ };
67
+ const resolvePath = (inputPath, projectRoot) => {
68
+ if (path.isAbsolute(inputPath)) {
69
+ return path.resolve(inputPath);
70
+ }
71
+ const candidates = [];
72
+ if (projectRoot) {
73
+ candidates.push(path.resolve(projectRoot, inputPath));
74
+ }
75
+ candidates.push(path.resolve(process.cwd(), inputPath));
76
+ if (projectRoot) {
77
+ for (const candidate of candidates) {
78
+ if (isSubPath(projectRoot, candidate)) {
79
+ return candidate;
80
+ }
81
+ }
82
+ }
83
+ return candidates[candidates.length - 1];
84
+ };
14
85
  const createBasicLambdaTimerJob = (scope, props) => {
15
86
  const lambdaProps = createBasicLambdaProps(props);
16
87
  let lambdaFunction = new aws_lambda_nodejs_1.NodejsFunction(scope, `${props.appPrefix}${props.functionName}`, lambdaProps);
@@ -23,26 +94,44 @@ const createBasicLambdaTimerJob = (scope, props) => {
23
94
  };
24
95
  exports.createBasicLambdaTimerJob = createBasicLambdaTimerJob;
25
96
  const createBasicLambdaProps = (props) => {
26
- let resolvedEntry;
27
- if (props.codePath && path.isAbsolute(props.codePath)) {
28
- resolvedEntry = props.codePath;
29
- }
30
- else if (props.codePath && props.projectRoot) {
31
- // codePath is relative, resolve from current directory + projectRoot
32
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
97
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
98
+ const defaultRelativeEntry = path.join("resources", "lambdas", "timer-jobs", props.functionName, "main.mts");
99
+ const entryPath = props.codePath ?? defaultRelativeEntry;
100
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
101
+ const cwd = path.resolve(process.cwd());
102
+ const entryDir = path.dirname(resolvedEntry);
103
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
104
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
105
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
106
+ if (!ancestor) {
107
+ throw new Error(`Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`);
108
+ }
109
+ effectiveProjectRoot = ancestor;
33
110
  }
34
- else if (props.projectRoot) {
35
- // No codePath, use default path with projectRoot
36
- resolvedEntry = path.resolve(process.cwd(), props.projectRoot, `resources/lambdas/timer-jobs/${props.functionName}/main.mts`);
111
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
112
+ throw new Error(`Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`);
37
113
  }
38
- else if (props.codePath) {
39
- // codePath without projectRoot
40
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
114
+ let resolvedDepsLockFilePath = props.depsLockFilePath
115
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
116
+ : undefined;
117
+ if (!resolvedDepsLockFilePath) {
118
+ const potentialLockFiles = [
119
+ findNearestLockFile(entryDir),
120
+ findNearestLockFile(cwd),
121
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
122
+ ];
123
+ for (const lockFile of potentialLockFiles) {
124
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
125
+ resolvedDepsLockFilePath = lockFile;
126
+ break;
127
+ }
128
+ }
41
129
  }
42
- else {
43
- // Default path without projectRoot
44
- resolvedEntry = path.join(`./resources/lambdas/timer-jobs/${props.functionName}/main.mts`);
130
+ if (resolvedDepsLockFilePath &&
131
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)) {
132
+ throw new Error(`Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`);
45
133
  }
134
+ const environmentVars = props.envs ?? {};
46
135
  const lambdaProp = {
47
136
  entry: resolvedEntry,
48
137
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${props.functionName}`,
@@ -52,7 +141,7 @@ const createBasicLambdaProps = (props) => {
52
141
  timeout: aws_cdk_lib_1.Duration.minutes(props.timeoutInMinutes ? props.timeoutInMinutes : 1),
53
142
  memorySize: props.memory,
54
143
  environment: {
55
- ...props.envs,
144
+ ...environmentVars,
56
145
  },
57
146
  bundling: {
58
147
  minify: true,
@@ -60,15 +149,15 @@ const createBasicLambdaProps = (props) => {
60
149
  sourceMap: true,
61
150
  sourceMapMode: aws_lambda_nodejs_1.SourceMapMode.EXTERNAL,
62
151
  environment: {
63
- ...props.envs,
152
+ ...environmentVars,
64
153
  },
65
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
66
- ...(props.depsLockFilePath && {
67
- depsLockFilePath: props.depsLockFilePath,
68
- }),
69
154
  },
70
155
  role: props.role,
71
156
  layers: undefined,
157
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
158
+ ...(resolvedDepsLockFilePath && {
159
+ depsLockFilePath: resolvedDepsLockFilePath,
160
+ }),
72
161
  };
73
162
  return lambdaProp;
74
163
  };
@@ -99,4 +188,4 @@ const addLambdaLayers = (scope, lambda, layerArns) => {
99
188
  });
100
189
  }
101
190
  };
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvbGFtYmRhL2NyZWF0ZS1iYXNpYy1sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUF1RDtBQUN2RCx1REFBK0Q7QUFDL0QscUVBSXVDO0FBQ3ZDLG1EQUFxRDtBQUNyRCw2QkFBOEI7QUFHOUIscUdBQW9GO0FBQ3BGLHVEQUFxRTtBQUNyRSx1RUFBZ0U7QUFDaEUsMkRBQWlEO0FBRTFDLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsS0FBZ0IsRUFDaEIsS0FBb0IsRUFDSixFQUFFO0lBQ2xCLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxELElBQUksY0FBYyxHQUFHLElBQUksa0NBQWMsQ0FDckMsS0FBSyxFQUNMLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQ3pDLFdBQVcsQ0FDWixDQUFDO0lBRUYsb0NBQW9DLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFckQsTUFBTSxTQUFTLEdBQUcsd0JBQXdCLENBQ3hDLEtBQUssRUFDTCxjQUFjLEVBQ2QsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQztJQUVGLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxtQ0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFeEQseUJBQXlCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUV6RSxlQUFlLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFN0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBM0JXLFFBQUEseUJBQXlCLDZCQTJCcEM7QUFFRixNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBb0IsRUFB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QUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xyXG5pbXBvcnQgeyBMYXllclZlcnNpb24sIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQge1xyXG4gIE5vZGVqc0Z1bmN0aW9uLFxyXG4gIE5vZGVqc0Z1bmN0aW9uUHJvcHMsXHJcbiAgU291cmNlTWFwTW9kZSxcclxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcclxuaW1wb3J0IHsgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xyXG5pbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5pbXBvcnQgeyBUaW1lckpvYlByb3BzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdGltZXItam9iXCI7XHJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XHJcbmltcG9ydCB7IFNFUlZJQ0VfUFJJTkNJUEFMIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9hd3Mtc2VydmljZS1wcmluY2lwYWwtY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IENyb25PcHRpb25zLCBSdWxlLCBTY2hlZHVsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XHJcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVCYXNpY0xhbWJkYVRpbWVySm9iID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgcHJvcHM6IFRpbWVySm9iUHJvcHNcclxuKTogTm9kZWpzRnVuY3Rpb24gPT4ge1xyXG4gIGNvbnN0IGxhbWJkYVByb3BzID0gY3JlYXRlQmFzaWNMYW1iZGFQcm9wcyhwcm9wcyk7XHJcblxyXG4gIGxldCBsYW1iZGFGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbihcclxuICAgIHNjb3BlLFxyXG4gICAgYCR7cHJvcHMuYXBwUHJlZml4fSR7cHJvcHMuZnVuY3Rpb25OYW1lfWAsXHJcbiAgICBsYW1iZGFQcm9wc1xyXG4gICk7XHJcblxyXG4gIGFkZEludm9rZVBlcm1pc3Npb25Ub0xhbWJkYUZvckV2ZW50cyhsYW1iZGFGdW5jdGlvbik7XHJcblxyXG4gIGNvbnN0IGV2ZW50UnVsZSA9IGNyZWF0ZUV2ZW50UnVsZUZvckxhbWJkYShcclxuICAgIHNjb3BlLFxyXG4gICAgbGFtYmRhRnVuY3Rpb24sXHJcbiAgICBwcm9wcy5jcm9uT3B0aW9uc1xyXG4gICk7XHJcblxyXG4gIGV2ZW50UnVsZS5hZGRUYXJnZXQobmV3IExhbWJkYUZ1bmN0aW9uKGxhbWJkYUZ1bmN0aW9uKSk7XHJcblxyXG4gIGdyYW50QWNjZXNzVG9EeW5hbW9UYWJsZXMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5keW5hbW9UYWJsZU5hbWVzKTtcclxuXHJcbiAgYWRkTGFtYmRhTGF5ZXJzKHNjb3BlLCBsYW1iZGFGdW5jdGlvbiwgcHJvcHMubGFtYmRhTGF5ZXJBcm4pO1xyXG5cclxuICByZXR1cm4gbGFtYmRhRnVuY3Rpb247XHJcbn07XHJcblxyXG5jb25zdCBjcmVhdGVCYXNpY0xhbWJkYVByb3BzID0gKHByb3BzOiBUaW1lckpvYlByb3BzKTogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9PiB7XHJcbiAgbGV0IHJlc29sdmVkRW50cnk6IHN0cmluZztcclxuXHJcbiAgaWYgKHByb3BzLmNvZGVQYXRoICYmIHBhdGguaXNBYnNvbHV0ZShwcm9wcy5jb2RlUGF0aCkpIHtcclxuICAgIHJlc29sdmVkRW50cnkgPSBwcm9wcy5jb2RlUGF0aDtcclxuICB9IGVsc2UgaWYgKHByb3BzLmNvZGVQYXRoICYmIHByb3BzLnByb2plY3RSb290KSB7XHJcbiAgICAvLyBjb2RlUGF0aCBpcyByZWxhdGl2ZSwgcmVzb2x2ZSBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5ICsgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvcHMuY29kZVBhdGgpO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMucHJvamVjdFJvb3QpIHtcclxuICAgIC8vIE5vIGNvZGVQYXRoLCB1c2UgZGVmYXVsdCBwYXRoIHdpdGggcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUoXHJcbiAgICAgIHByb2Nlc3MuY3dkKCksXHJcbiAgICAgIHByb3BzLnByb2plY3RSb290LFxyXG4gICAgICBgcmVzb3VyY2VzL2xhbWJkYXMvdGltZXItam9icy8ke3Byb3BzLmZ1bmN0aW9uTmFtZX0vbWFpbi5tdHNgXHJcbiAgICApO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMuY29kZVBhdGgpIHtcclxuICAgIC8vIGNvZGVQYXRoIHdpdGhvdXQgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvcHMuY29kZVBhdGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBEZWZhdWx0IHBhdGggd2l0aG91dCBwcm9qZWN0Um9vdFxyXG4gICAgcmVzb2x2ZWRFbnRyeSA9IHBhdGguam9pbihcclxuICAgICAgYC4vcmVzb3VyY2VzL2xhbWJkYXMvdGltZXItam9icy8ke3Byb3BzLmZ1bmN0aW9uTmFtZX0vbWFpbi5tdHNgXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbGFtYmRhUHJvcDogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9IHtcclxuICAgIGVudHJ5OiByZXNvbHZlZEVudHJ5LFxyXG4gICAgZnVuY3Rpb25OYW1lOiBgJHtwcm9wcy5hcHBQcmVmaXggPyBgJHtwcm9wcy5hcHBQcmVmaXh9LWAgOiBcIlwifSR7XHJcbiAgICAgIHByb3BzLmZ1bmN0aW9uTmFtZVxyXG4gICAgfWAsXHJcbiAgICBoYW5kbGVyOiBcIm1haW4udHNcIixcclxuICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXHJcbiAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU19MQVRFU1QsXHJcbiAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKFxyXG4gICAgICBwcm9wcy50aW1lb3V0SW5NaW51dGVzID8gcHJvcHMudGltZW91dEluTWludXRlcyA6IDFcclxuICAgICksXHJcbiAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnksXHJcbiAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAuLi5wcm9wcy5lbnZzLFxyXG4gICAgfSxcclxuICAgIGJ1bmRsaW5nOiB7XHJcbiAgICAgIG1pbmlmeTogdHJ1ZSxcclxuICAgICAgdGFyZ2V0OiBgZXNuZXh0YCxcclxuICAgICAgc291cmNlTWFwOiB0cnVlLFxyXG4gICAgICBzb3VyY2VNYXBNb2RlOiBTb3VyY2VNYXBNb2RlLkVYVEVSTkFMLFxyXG4gICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgIC4uLnByb3BzLmVudnMsXHJcbiAgICAgIH0sXHJcbiAgICAgIC4uLihwcm9wcy5wcm9qZWN0Um9vdCAmJiB7IHByb2plY3RSb290OiBwcm9wcy5wcm9qZWN0Um9vdCB9KSxcclxuICAgICAgLi4uKHByb3BzLmRlcHNMb2NrRmlsZVBhdGggJiYge1xyXG4gICAgICAgIGRlcHNMb2NrRmlsZVBhdGg6IHByb3BzLmRlcHNMb2NrRmlsZVBhdGgsXHJcbiAgICAgIH0pLFxyXG4gICAgfSxcclxuICAgIHJvbGU6IHByb3BzLnJvbGUsXHJcbiAgICBsYXllcnM6IHVuZGVmaW5lZCxcclxuICB9O1xyXG5cclxuICByZXR1cm4gbGFtYmRhUHJvcDtcclxufTtcclxuXHJcbmNvbnN0IGFkZEludm9rZVBlcm1pc3Npb25Ub0xhbWJkYUZvckV2ZW50cyA9IChsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uKSA9PiB7XHJcbiAgbGFtYmRhLmFkZFBlcm1pc3Npb24oYEludm9rZVBlcm1pc3Npb24tJHtsYW1iZGEuZnVuY3Rpb25OYW1lfWAsIHtcclxuICAgIHByaW5jaXBhbDogbmV3IFNlcnZpY2VQcmluY2lwYWwoU0VSVklDRV9QUklOQ0lQQUwuRVZFTlRTKSxcclxuICB9KTtcclxufTtcclxuXHJcbmNvbnN0IGNyZWF0ZUV2ZW50UnVsZUZvckxhbWJkYSA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgb3B0aW9uczogQ3Jvbk9wdGlvbnNcclxuKSA9PiB7XHJcbiAgY29uc3QgZXZlbnRSdWxlID0gbmV3IFJ1bGUoXHJcbiAgICBzY29wZSxcclxuICAgIGBzY2hlZHVsZVJ1bGUtJHtsYW1iZGE/Lm5vZGUuaWQgfHwgXCIwMTBcIn1gLFxyXG4gICAge1xyXG4gICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3JvbihvcHRpb25zKSxcclxuICAgIH1cclxuICApO1xyXG5cclxuICByZXR1cm4gZXZlbnRSdWxlO1xyXG59O1xyXG5cclxuY29uc3QgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgdGFibGVOYW1lcz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmICh0YWJsZU5hbWVzICYmIHRhYmxlTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgdGFibGVOYW1lcy5mb3JFYWNoKCh0YWJsZU5hbWUpID0+IHtcclxuICAgICAgY29uc3QgdGFibGUgPSBUYWJsZS5mcm9tVGFibGVOYW1lKHNjb3BlLCBgJHt0YWJsZU5hbWV9LXRhYmxlYCwgdGFibGVOYW1lKTtcclxuXHJcbiAgICAgIHRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYWRkTGFtYmRhTGF5ZXJzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICBsYXllckFybnM/OiBzdHJpbmdbXVxyXG4pID0+IHtcclxuICBpZiAobGF5ZXJBcm5zICYmIGxheWVyQXJucy5sZW5ndGggPiAwKSB7XHJcbiAgICBsYXllckFybnMuZm9yRWFjaCgoYXJuOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXHJcbiAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgYGNvbW1vbi1sYXllci0ke2lkeH1gLFxyXG4gICAgICAgIGFyblxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGFtYmRhLmFkZExheWVycyhsYXllcik7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ==
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvbGFtYmRhL2NyZWF0ZS1iYXNpYy1sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUF1RDtBQUN2RCx1REFBK0Q7QUFDL0QscUVBSXVDO0FBQ3ZDLG1EQUFxRDtBQUNyRCx5QkFBMEI7QUFDMUIsNkJBQThCO0FBRzlCLHFHQUFvRjtBQUNwRix1REFBcUU7QUFDckUsdUVBQWdFO0FBQ2hFLDJEQUFpRDtBQUVqRCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQVcsRUFBRTtJQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE9BQU8sUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxXQUFvQixFQUFzQixFQUFFO0lBQ3RFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxRQUFnQixFQUFzQixFQUFFO0lBQ25FLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLEtBQUssTUFBTSxTQUFTLElBQUksZUFBZSxFQUFFLENBQUM7WUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN4RCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDaEYsT0FBTyxpQkFBaUIsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3JCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQWUsRUFBc0IsRUFBRTtJQUNqRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEMsS0FBSyxNQUFNLFdBQVcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUvQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdEYsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUN6QixPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksU0FBUyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUMvQixTQUFTLEdBQUcsWUFBWSxDQUFDO2dCQUN6QixNQUFNO1lBQ1IsQ0FBQztZQUNELFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWlCLEVBQUUsV0FBb0IsRUFBVSxFQUFFO0lBQ3RFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQ2hDLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFeEQsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQUVLLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsS0FBZ0IsRUFDaEIsS0FBb0IsRUFDSixFQUFFO0lBQ2xCLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxELElBQUksY0FBYyxHQUFHLElBQUksa0NBQWMsQ0FDckMsS0FBSyxFQUNMLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQ3pDLFdBQVcsQ0FDWixDQUFDO0lBRUYsb0NBQW9DLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFckQsTUFBTSxTQUFTLEdBQUcsd0JBQXdCLENBQ3hDLEtBQUssRUFDTCxjQUFjLEVBQ2QsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQztJQUVGLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxtQ0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFeEQseUJBQXlCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUV6RSxlQUFlLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFN0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBM0JXLFFBQUEseUJBQXlCLDZCQTJCcEM7QUFFRixNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBb0IsRUFBdUIsRUFBRTtJQUMzRSxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3BDLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssQ0FBQyxZQUFZLEVBQ2xCLFVBQVUsQ0FDWCxDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQztJQUN6RCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFbEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTdDLElBQUksb0JBQW9CLEdBQUcsbUJBQW1CLElBQUksR0FBRyxDQUFDO0lBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FDYix3REFBd0Qsb0JBQW9CLFFBQVEsYUFBYSxHQUFHLENBQ3JHLENBQUM7UUFDSixDQUFDO1FBQ0Qsb0JBQW9CLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsYUFBYSx1Q0FBdUMsb0JBQW9CLEdBQUcsQ0FDckcsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLHdCQUF3QixHQUFHLEtBQUssQ0FBQyxnQkFBZ0I7UUFDbkQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7UUFDMUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVkLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sa0JBQWtCLEdBQUc7WUFDekIsbUJBQW1CLENBQUMsUUFBUSxDQUFDO1lBQzdCLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztZQUN4QixvQkFBb0IsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDckYsQ0FBQztRQUVGLEtBQUssTUFBTSxRQUFRLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFFBQVEsSUFBSSxTQUFTLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsd0JBQXdCLEdBQUcsUUFBUSxDQUFDO2dCQUNwQyxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFDRSx3QkFBd0I7UUFDeEIsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsd0JBQXdCLENBQUMsRUFDMUQsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsNkJBQTZCLHdCQUF3Qix1Q0FBdUMsb0JBQW9CLEdBQUcsQ0FDcEgsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV6QyxNQUFNLFVBQVUsR0FBd0I7UUFDdEMsS0FBSyxFQUFFLGFBQWE7UUFDcEIsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FDM0QsS0FBSyxDQUFDLFlBQ1IsRUFBRTtRQUNGLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLFlBQVksRUFBRSx3QkFBYSxDQUFDLFNBQVM7UUFDckMsT0FBTyxFQUFFLG9CQUFPLENBQUMsYUFBYTtRQUM5QixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQ3ZCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BEO1FBQ0QsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3hCLFdBQVcsRUFBRTtZQUNYLEdBQUcsZUFBZTtTQUNuQjtRQUNELFFBQVEsRUFBRTtZQUNSLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixhQUFhLEVBQUUsaUNBQWEsQ0FBQyxRQUFRO1lBQ3JDLFdBQVcsRUFBRTtnQkFDWCxHQUFHLGVBQWU7YUFDbkI7U0FDRjtRQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixHQUFHLENBQUMsb0JBQW9CLElBQUksRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztRQUNsRSxHQUFHLENBQUMsd0JBQXdCLElBQUk7WUFDOUIsZ0JBQWdCLEVBQUUsd0JBQXdCO1NBQzNDLENBQUM7S0FDSCxDQUFDO0lBRUYsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQ0FBb0MsR0FBRyxDQUFDLE1BQXNCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLENBQUMsYUFBYSxDQUFDLG9CQUFvQixNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUU7UUFDOUQsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsbURBQWlCLENBQUMsTUFBTSxDQUFDO0tBQzFELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sd0JBQXdCLEdBQUcsQ0FDL0IsS0FBZ0IsRUFDaEIsTUFBc0IsRUFDdEIsT0FBb0IsRUFDcEIsRUFBRTtJQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksaUJBQUksQ0FDeEIsS0FBSyxFQUNMLGdCQUFnQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFDMUM7UUFDRSxRQUFRLEVBQUUscUJBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0tBQ2pDLENBQ0YsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUcsQ0FDaEMsS0FBZ0IsRUFDaEIsTUFBc0IsRUFDdEIsVUFBcUIsRUFDckIsRUFBRTtJQUNGLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLG9CQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLFNBQVMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRTFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUN0QixLQUFnQixFQUNoQixNQUFzQixFQUN0QixTQUFvQixFQUNwQixFQUFFO0lBQ0YsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLHlCQUFZLENBQUMsbUJBQW1CLENBQzVDLEtBQUssRUFDTCxnQkFBZ0IsR0FBRyxFQUFFLEVBQ3JCLEdBQUcsQ0FDSixDQUFDO1lBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcclxuaW1wb3J0IHsgTGF5ZXJWZXJzaW9uLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcclxuaW1wb3J0IHtcclxuICBOb2RlanNGdW5jdGlvbixcclxuICBOb2RlanNGdW5jdGlvblByb3BzLFxyXG4gIFNvdXJjZU1hcE1vZGUsXHJcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XHJcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcclxuaW1wb3J0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5pbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5pbXBvcnQgeyBUaW1lckpvYlByb3BzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdGltZXItam9iXCI7XHJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XHJcbmltcG9ydCB7IFNFUlZJQ0VfUFJJTkNJUEFMIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9hd3Mtc2VydmljZS1wcmluY2lwYWwtY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IENyb25PcHRpb25zLCBSdWxlLCBTY2hlZHVsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XHJcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcclxuXHJcbmNvbnN0IGlzU3ViUGF0aCA9IChyb290OiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShyb290KSwgcGF0aC5yZXNvbHZlKHRhcmdldCkpO1xyXG4gIHJldHVybiByZWxhdGl2ZSA9PT0gXCJcIiB8fCAoIXJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuLlwiKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSk7XHJcbn07XHJcblxyXG5jb25zdCBMT0NLX0ZJTEVfTkFNRVMgPSBbXCJwbnBtLWxvY2sueWFtbFwiLCBcInlhcm4ubG9ja1wiLCBcInBhY2thZ2UtbG9jay5qc29uXCJdO1xyXG5cclxuY29uc3QgcmVzb2x2ZVByb2plY3RSb290ID0gKHByb2plY3RSb290Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICBpZiAoIXByb2plY3RSb290KSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShwcm9qZWN0Um9vdClcclxuICAgID8gcGF0aC5yZXNvbHZlKHByb2plY3RSb290KVxyXG4gICAgOiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvamVjdFJvb3QpO1xyXG59O1xyXG5cclxuY29uc3QgZmluZE5lYXJlc3RMb2NrRmlsZSA9IChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICBsZXQgY3VycmVudCA9IHBhdGgucmVzb2x2ZShzdGFydERpcik7XHJcbiAgY29uc3QgeyByb290IH0gPSBwYXRoLnBhcnNlKGN1cnJlbnQpO1xyXG5cclxuICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgTE9DS19GSUxFX05BTUVTKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnQsIGNhbmRpZGF0ZSk7XHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHJlc29sdmVkQ2FuZGlkYXRlKSAmJiBmcy5zdGF0U3luYyhyZXNvbHZlZENhbmRpZGF0ZSkuaXNGaWxlKCkpIHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRDYW5kaWRhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3VycmVudCA9PT0gcm9vdCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZmluZENvbW1vbkFuY2VzdG9yID0gKHBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XHJcbiAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGxldCBhbmNlc3RvciA9IHBhdGgucmVzb2x2ZShwYXRoc1swXSk7XHJcblxyXG4gIGZvciAoY29uc3QgY3VycmVudFBhdGggb2YgcGF0aHMuc2xpY2UoMSkpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IHBhdGgucmVzb2x2ZShjdXJyZW50UGF0aCk7XHJcbiAgICBjb25zdCBhbmNlc3RvclJvb3QgPSBwYXRoLnBhcnNlKGFuY2VzdG9yKS5yb290O1xyXG5cclxuICAgIGlmIChwYXRoLnBhcnNlKGFuY2VzdG9yKS5yb290LnRvTG93ZXJDYXNlKCkgIT09IHBhdGgucGFyc2UodGFyZ2V0KS5yb290LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2FuZGlkYXRlID0gYW5jZXN0b3I7XHJcbiAgICB3aGlsZSAoIWlzU3ViUGF0aChjYW5kaWRhdGUsIHRhcmdldCkpIHtcclxuICAgICAgaWYgKGNhbmRpZGF0ZSA9PT0gYW5jZXN0b3JSb290KSB7XHJcbiAgICAgICAgY2FuZGlkYXRlID0gYW5jZXN0b3JSb290O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhbmRpZGF0ZSA9IHBhdGguZGlybmFtZShjYW5kaWRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFuY2VzdG9yID0gY2FuZGlkYXRlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGFuY2VzdG9yO1xyXG59O1xyXG5cclxuY29uc3QgcmVzb2x2ZVBhdGggPSAoaW5wdXRQYXRoOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBpZiAocGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCkpIHtcclxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoaW5wdXRQYXRoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgaWYgKHByb2plY3RSb290KSB7XHJcbiAgICBjYW5kaWRhdGVzLnB1c2gocGF0aC5yZXNvbHZlKHByb2plY3RSb290LCBpbnB1dFBhdGgpKTtcclxuICB9XHJcbiAgY2FuZGlkYXRlcy5wdXNoKHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dFBhdGgpKTtcclxuXHJcbiAgaWYgKHByb2plY3RSb290KSB7XHJcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XHJcbiAgICAgIGlmIChpc1N1YlBhdGgocHJvamVjdFJvb3QsIGNhbmRpZGF0ZSkpIHtcclxuICAgICAgICByZXR1cm4gY2FuZGlkYXRlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2FuZGlkYXRlc1tjYW5kaWRhdGVzLmxlbmd0aCAtIDFdO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZUJhc2ljTGFtYmRhVGltZXJKb2IgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBwcm9wczogVGltZXJKb2JQcm9wc1xyXG4pOiBOb2RlanNGdW5jdGlvbiA9PiB7XHJcbiAgY29uc3QgbGFtYmRhUHJvcHMgPSBjcmVhdGVCYXNpY0xhbWJkYVByb3BzKHByb3BzKTtcclxuXHJcbiAgbGV0IGxhbWJkYUZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKFxyXG4gICAgc2NvcGUsXHJcbiAgICBgJHtwcm9wcy5hcHBQcmVmaXh9JHtwcm9wcy5mdW5jdGlvbk5hbWV9YCxcclxuICAgIGxhbWJkYVByb3BzXHJcbiAgKTtcclxuXHJcbiAgYWRkSW52b2tlUGVybWlzc2lvblRvTGFtYmRhRm9yRXZlbnRzKGxhbWJkYUZ1bmN0aW9uKTtcclxuXHJcbiAgY29uc3QgZXZlbnRSdWxlID0gY3JlYXRlRXZlbnRSdWxlRm9yTGFtYmRhKFxyXG4gICAgc2NvcGUsXHJcbiAgICBsYW1iZGFGdW5jdGlvbixcclxuICAgIHByb3BzLmNyb25PcHRpb25zXHJcbiAgKTtcclxuXHJcbiAgZXZlbnRSdWxlLmFkZFRhcmdldChuZXcgTGFtYmRhRnVuY3Rpb24obGFtYmRhRnVuY3Rpb24pKTtcclxuXHJcbiAgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyhzY29wZSwgbGFtYmRhRnVuY3Rpb24sIHByb3BzLmR5bmFtb1RhYmxlTmFtZXMpO1xyXG5cclxuICBhZGRMYW1iZGFMYXllcnMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5sYW1iZGFMYXllckFybik7XHJcblxyXG4gIHJldHVybiBsYW1iZGFGdW5jdGlvbjtcclxufTtcclxuXHJcbmNvbnN0IGNyZWF0ZUJhc2ljTGFtYmRhUHJvcHMgPSAocHJvcHM6IFRpbWVySm9iUHJvcHMpOiBOb2RlanNGdW5jdGlvblByb3BzID0+IHtcclxuICBjb25zdCByZXNvbHZlZFByb2plY3RSb290ID0gcmVzb2x2ZVByb2plY3RSb290KHByb3BzLnByb2plY3RSb290KTtcclxuICBjb25zdCBkZWZhdWx0UmVsYXRpdmVFbnRyeSA9IHBhdGguam9pbihcclxuICAgIFwicmVzb3VyY2VzXCIsXHJcbiAgICBcImxhbWJkYXNcIixcclxuICAgIFwidGltZXItam9ic1wiLFxyXG4gICAgcHJvcHMuZnVuY3Rpb25OYW1lLFxyXG4gICAgXCJtYWluLm10c1wiXHJcbiAgKTtcclxuICBjb25zdCBlbnRyeVBhdGggPSBwcm9wcy5jb2RlUGF0aCA/PyBkZWZhdWx0UmVsYXRpdmVFbnRyeTtcclxuICBjb25zdCByZXNvbHZlZEVudHJ5ID0gcmVzb2x2ZVBhdGgoZW50cnlQYXRoLCByZXNvbHZlZFByb2plY3RSb290KTtcclxuXHJcbiAgY29uc3QgY3dkID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpO1xyXG4gIGNvbnN0IGVudHJ5RGlyID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRW50cnkpO1xyXG5cclxuICBsZXQgZWZmZWN0aXZlUHJvamVjdFJvb3QgPSByZXNvbHZlZFByb2plY3RSb290ID8/IGN3ZDtcclxuICBpZiAoIWlzU3ViUGF0aChlZmZlY3RpdmVQcm9qZWN0Um9vdCwgcmVzb2x2ZWRFbnRyeSkpIHtcclxuICAgIGNvbnN0IGFuY2VzdG9yID0gZmluZENvbW1vbkFuY2VzdG9yKFtlZmZlY3RpdmVQcm9qZWN0Um9vdCwgZW50cnlEaXJdKTtcclxuICAgIGlmICghYW5jZXN0b3IpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBVbmFibGUgdG8gZGV0ZXJtaW5lIGEgcHJvamVjdFJvb3QgdGhhdCBjb250YWlucyBib3RoICR7ZWZmZWN0aXZlUHJvamVjdFJvb3R9IGFuZCAke3Jlc29sdmVkRW50cnl9LmBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVmZmVjdGl2ZVByb2plY3RSb290ID0gYW5jZXN0b3I7XHJcbiAgfVxyXG5cclxuICBpZiAoIWlzU3ViUGF0aChlZmZlY3RpdmVQcm9qZWN0Um9vdCwgcmVzb2x2ZWRFbnRyeSkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYFJlc29sdmVkIGxhbWJkYSBlbnRyeSAke3Jlc29sdmVkRW50cnl9IG11c3QgYmUgbG9jYXRlZCB3aXRoaW4gcHJvamVjdFJvb3QgJHtlZmZlY3RpdmVQcm9qZWN0Um9vdH0uYFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGxldCByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGggPSBwcm9wcy5kZXBzTG9ja0ZpbGVQYXRoXHJcbiAgICA/IHJlc29sdmVQYXRoKHByb3BzLmRlcHNMb2NrRmlsZVBhdGgsIHJlc29sdmVkUHJvamVjdFJvb3QpXHJcbiAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgaWYgKCFyZXNvbHZlZERlcHNMb2NrRmlsZVBhdGgpIHtcclxuICAgIGNvbnN0IHBvdGVudGlhbExvY2tGaWxlcyA9IFtcclxuICAgICAgZmluZE5lYXJlc3RMb2NrRmlsZShlbnRyeURpciksXHJcbiAgICAgIGZpbmROZWFyZXN0TG9ja0ZpbGUoY3dkKSxcclxuICAgICAgZWZmZWN0aXZlUHJvamVjdFJvb3QgIT09IGN3ZCA/IGZpbmROZWFyZXN0TG9ja0ZpbGUoZWZmZWN0aXZlUHJvamVjdFJvb3QpIDogdW5kZWZpbmVkLFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxvY2tGaWxlIG9mIHBvdGVudGlhbExvY2tGaWxlcykge1xyXG4gICAgICBpZiAobG9ja0ZpbGUgJiYgaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCBsb2NrRmlsZSkpIHtcclxuICAgICAgICByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGggPSBsb2NrRmlsZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgcmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRoICYmXHJcbiAgICAhaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGgpXHJcbiAgKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgIGBSZXNvbHZlZCBkZXBzTG9ja0ZpbGVQYXRoICR7cmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRofSBtdXN0IGJlIGxvY2F0ZWQgd2l0aGluIHByb2plY3RSb290ICR7ZWZmZWN0aXZlUHJvamVjdFJvb3R9LmBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBlbnZpcm9ubWVudFZhcnMgPSBwcm9wcy5lbnZzID8/IHt9O1xyXG5cclxuICBjb25zdCBsYW1iZGFQcm9wOiBOb2RlanNGdW5jdGlvblByb3BzID0ge1xyXG4gICAgZW50cnk6IHJlc29sdmVkRW50cnksXHJcbiAgICBmdW5jdGlvbk5hbWU6IGAke3Byb3BzLmFwcFByZWZpeCA/IGAke3Byb3BzLmFwcFByZWZpeH0tYCA6IFwiXCJ9JHtcclxuICAgICAgcHJvcHMuZnVuY3Rpb25OYW1lXHJcbiAgICB9YCxcclxuICAgIGhhbmRsZXI6IFwibWFpbi50c1wiLFxyXG4gICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcclxuICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTX0xBVEVTVCxcclxuICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoXHJcbiAgICAgIHByb3BzLnRpbWVvdXRJbk1pbnV0ZXMgPyBwcm9wcy50aW1lb3V0SW5NaW51dGVzIDogMVxyXG4gICAgKSxcclxuICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeSxcclxuICAgIGVudmlyb25tZW50OiB7XHJcbiAgICAgIC4uLmVudmlyb25tZW50VmFycyxcclxuICAgIH0sXHJcbiAgICBidW5kbGluZzoge1xyXG4gICAgICBtaW5pZnk6IHRydWUsXHJcbiAgICAgIHRhcmdldDogYGVzbmV4dGAsXHJcbiAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcclxuICAgICAgc291cmNlTWFwTW9kZTogU291cmNlTWFwTW9kZS5FWFRFUk5BTCxcclxuICAgICAgZW52aXJvbm1lbnQ6IHtcclxuICAgICAgICAuLi5lbnZpcm9ubWVudFZhcnMsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgcm9sZTogcHJvcHMucm9sZSxcclxuICAgIGxheWVyczogdW5kZWZpbmVkLFxyXG4gICAgLi4uKGVmZmVjdGl2ZVByb2plY3RSb290ICYmIHsgcHJvamVjdFJvb3Q6IGVmZmVjdGl2ZVByb2plY3RSb290IH0pLFxyXG4gICAgLi4uKHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCAmJiB7XHJcbiAgICAgIGRlcHNMb2NrRmlsZVBhdGg6IHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCxcclxuICAgIH0pLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBsYW1iZGFQcm9wO1xyXG59O1xyXG5cclxuY29uc3QgYWRkSW52b2tlUGVybWlzc2lvblRvTGFtYmRhRm9yRXZlbnRzID0gKGxhbWJkYTogTm9kZWpzRnVuY3Rpb24pID0+IHtcclxuICBsYW1iZGEuYWRkUGVybWlzc2lvbihgSW52b2tlUGVybWlzc2lvbi0ke2xhbWJkYS5mdW5jdGlvbk5hbWV9YCwge1xyXG4gICAgcHJpbmNpcGFsOiBuZXcgU2VydmljZVByaW5jaXBhbChTRVJWSUNFX1BSSU5DSVBBTC5FVkVOVFMpLFxyXG4gIH0pO1xyXG59O1xyXG5cclxuY29uc3QgY3JlYXRlRXZlbnRSdWxlRm9yTGFtYmRhID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICBvcHRpb25zOiBDcm9uT3B0aW9uc1xyXG4pID0+IHtcclxuICBjb25zdCBldmVudFJ1bGUgPSBuZXcgUnVsZShcclxuICAgIHNjb3BlLFxyXG4gICAgYHNjaGVkdWxlUnVsZS0ke2xhbWJkYT8ubm9kZS5pZCB8fCBcIjAxMFwifWAsXHJcbiAgICB7XHJcbiAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKG9wdGlvbnMpLFxyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIHJldHVybiBldmVudFJ1bGU7XHJcbn07XHJcblxyXG5jb25zdCBncmFudEFjY2Vzc1RvRHluYW1vVGFibGVzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICB0YWJsZU5hbWVzPzogc3RyaW5nW11cclxuKSA9PiB7XHJcbiAgaWYgKHRhYmxlTmFtZXMgJiYgdGFibGVOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICB0YWJsZU5hbWVzLmZvckVhY2goKHRhYmxlTmFtZSkgPT4ge1xyXG4gICAgICBjb25zdCB0YWJsZSA9IFRhYmxlLmZyb21UYWJsZU5hbWUoc2NvcGUsIGAke3RhYmxlTmFtZX0tdGFibGVgLCB0YWJsZU5hbWUpO1xyXG5cclxuICAgICAgdGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGxhbWJkYSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBhZGRMYW1iZGFMYXllcnMgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uLFxyXG4gIGxheWVyQXJucz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmIChsYXllckFybnMgJiYgbGF5ZXJBcm5zLmxlbmd0aCA+IDApIHtcclxuICAgIGxheWVyQXJucy5mb3JFYWNoKChhcm46IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgbGF5ZXIgPSBMYXllclZlcnNpb24uZnJvbUxheWVyVmVyc2lvbkFybihcclxuICAgICAgICBzY29wZSxcclxuICAgICAgICBgY29tbW9uLWxheWVyLSR7aWR4fWAsXHJcbiAgICAgICAgYXJuXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsYW1iZGEuYWRkTGF5ZXJzKGxheWVyKTtcclxuICAgIH0pO1xyXG4gIH1cclxufTtcclxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sylvesterllc/aws-constructs",
3
- "version": "1.1.25",
3
+ "version": "1.1.27",
4
4
  "description": "AWS Constructs",
5
5
  "main": "dist/index.js",
6
6
  "keywords": [
@@ -8,7 +8,7 @@ export const config: IAppConfig = {
8
8
  name: `${process.env.APP_NAME}`,
9
9
  accountNumber: process.env.CDK_DEFAULT_ACCOUNT || "",
10
10
  region: process.env.CDK_DEFAULT_REGION || "us-east-1",
11
- stackRuntime: Runtime.NODEJS_22_X,
11
+ stackRuntime: Runtime.NODEJS_LATEST,
12
12
  },
13
13
  API: {
14
14
  Name: `${process.env.APP_NAME}-auth-api`,
@@ -7,11 +7,101 @@ import {
7
7
  SourceMapMode,
8
8
  } from "aws-cdk-lib/aws-lambda-nodejs";
9
9
  import { RetentionDays } from "aws-cdk-lib/aws-logs";
10
+ import fs = require("fs");
10
11
  import path = require("path");
11
12
  import { LambdaProps } from "../../interfaces/lambda";
12
13
  import { Construct } from "constructs";
13
14
  import { Table } from "aws-cdk-lib/aws-dynamodb";
14
15
 
16
+ const isSubPath = (root: string, target: string): boolean => {
17
+ const relative = path.relative(path.resolve(root), path.resolve(target));
18
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
19
+ };
20
+
21
+ const LOCK_FILE_NAMES = ["pnpm-lock.yaml", "yarn.lock", "package-lock.json"];
22
+
23
+ const resolveProjectRoot = (projectRoot?: string): string | undefined => {
24
+ if (!projectRoot) {
25
+ return undefined;
26
+ }
27
+
28
+ return path.isAbsolute(projectRoot)
29
+ ? path.resolve(projectRoot)
30
+ : path.resolve(process.cwd(), projectRoot);
31
+ };
32
+
33
+ const findNearestLockFile = (startDir: string): string | undefined => {
34
+ let current = path.resolve(startDir);
35
+ const { root } = path.parse(current);
36
+
37
+ while (true) {
38
+ for (const candidate of LOCK_FILE_NAMES) {
39
+ const resolvedCandidate = path.join(current, candidate);
40
+ if (fs.existsSync(resolvedCandidate) && fs.statSync(resolvedCandidate).isFile()) {
41
+ return resolvedCandidate;
42
+ }
43
+ }
44
+
45
+ if (current === root) {
46
+ return undefined;
47
+ }
48
+
49
+ current = path.dirname(current);
50
+ }
51
+ };
52
+
53
+ const findCommonAncestor = (paths: string[]): string | undefined => {
54
+ if (paths.length === 0) {
55
+ return undefined;
56
+ }
57
+
58
+ let ancestor = path.resolve(paths[0]);
59
+
60
+ for (const currentPath of paths.slice(1)) {
61
+ const target = path.resolve(currentPath);
62
+ const ancestorRoot = path.parse(ancestor).root;
63
+
64
+ if (path.parse(ancestor).root.toLowerCase() !== path.parse(target).root.toLowerCase()) {
65
+ return undefined;
66
+ }
67
+
68
+ let candidate = ancestor;
69
+ while (!isSubPath(candidate, target)) {
70
+ if (candidate === ancestorRoot) {
71
+ candidate = ancestorRoot;
72
+ break;
73
+ }
74
+ candidate = path.dirname(candidate);
75
+ }
76
+
77
+ ancestor = candidate;
78
+ }
79
+
80
+ return ancestor;
81
+ };
82
+
83
+ const resolvePath = (inputPath: string, projectRoot?: string): string => {
84
+ if (path.isAbsolute(inputPath)) {
85
+ return path.resolve(inputPath);
86
+ }
87
+
88
+ const candidates: string[] = [];
89
+ if (projectRoot) {
90
+ candidates.push(path.resolve(projectRoot, inputPath));
91
+ }
92
+ candidates.push(path.resolve(process.cwd(), inputPath));
93
+
94
+ if (projectRoot) {
95
+ for (const candidate of candidates) {
96
+ if (isSubPath(projectRoot, candidate)) {
97
+ return candidate;
98
+ }
99
+ }
100
+ }
101
+
102
+ return candidates[candidates.length - 1];
103
+ };
104
+
15
105
  export const createBasicLambda = (
16
106
  scope: Construct,
17
107
  props: LambdaProps
@@ -32,30 +122,66 @@ export const createBasicLambda = (
32
122
  };
33
123
 
34
124
  const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
35
- let resolvedEntry: string;
36
-
37
- if (props.codePath && path.isAbsolute(props.codePath)) {
38
- resolvedEntry = props.codePath;
39
- } else if (props.codePath && props.projectRoot) {
40
- // codePath is relative, resolve from current directory + projectRoot
41
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
42
- } else if (props.projectRoot) {
43
- // No codePath, use default path with projectRoot
44
- resolvedEntry = path.resolve(
45
- process.cwd(),
46
- props.projectRoot,
47
- `resources/lambdas/${props.functionName}/main.mts`
125
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
126
+ const defaultRelativeEntry = path.join(
127
+ "resources",
128
+ "lambdas",
129
+ props.functionName,
130
+ "main.mts"
131
+ );
132
+ const entryPath = props.codePath ?? defaultRelativeEntry;
133
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
134
+
135
+ const cwd = path.resolve(process.cwd());
136
+ const entryDir = path.dirname(resolvedEntry);
137
+
138
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
139
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
140
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
141
+ if (!ancestor) {
142
+ throw new Error(
143
+ `Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`
144
+ );
145
+ }
146
+ effectiveProjectRoot = ancestor;
147
+ }
148
+
149
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
150
+ throw new Error(
151
+ `Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`
48
152
  );
49
- } else if (props.codePath) {
50
- // codePath without projectRoot
51
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
52
- } else {
53
- // Default path without projectRoot
54
- resolvedEntry = path.join(
55
- `./resources/lambdas/${props.functionName}/main.mts`
153
+ }
154
+
155
+ let resolvedDepsLockFilePath = props.depsLockFilePath
156
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
157
+ : undefined;
158
+
159
+ if (!resolvedDepsLockFilePath) {
160
+ const potentialLockFiles = [
161
+ findNearestLockFile(entryDir),
162
+ findNearestLockFile(cwd),
163
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
164
+ ];
165
+
166
+ for (const lockFile of potentialLockFiles) {
167
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
168
+ resolvedDepsLockFilePath = lockFile;
169
+ break;
170
+ }
171
+ }
172
+ }
173
+
174
+ if (
175
+ resolvedDepsLockFilePath &&
176
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)
177
+ ) {
178
+ throw new Error(
179
+ `Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`
56
180
  );
57
181
  }
58
182
 
183
+ const environmentVars = props.envs ?? {};
184
+
59
185
  const lambdaProp: NodejsFunctionProps = {
60
186
  entry: resolvedEntry,
61
187
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
@@ -69,7 +195,7 @@ const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
69
195
  ),
70
196
  memorySize: props.memory,
71
197
  environment: {
72
- ...props.envs,
198
+ ...environmentVars,
73
199
  },
74
200
  bundling: {
75
201
  minify: true,
@@ -77,15 +203,15 @@ const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
77
203
  sourceMap: true,
78
204
  sourceMapMode: SourceMapMode.EXTERNAL,
79
205
  environment: {
80
- ...props.envs,
206
+ ...environmentVars,
81
207
  },
82
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
83
- ...(props.depsLockFilePath && {
84
- depsLockFilePath: props.depsLockFilePath,
85
- }),
86
208
  },
87
209
  role: props.role,
88
210
  layers: undefined,
211
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
212
+ ...(resolvedDepsLockFilePath && {
213
+ depsLockFilePath: resolvedDepsLockFilePath,
214
+ }),
89
215
  };
90
216
 
91
217
  return lambdaProp;
@@ -7,6 +7,7 @@ import {
7
7
  SourceMapMode,
8
8
  } from "aws-cdk-lib/aws-lambda-nodejs";
9
9
  import { RetentionDays } from "aws-cdk-lib/aws-logs";
10
+ import fs = require("fs");
10
11
  import path = require("path");
11
12
  import { TimerJobProps } from "../../interfaces/timer-job";
12
13
  import { Construct } from "constructs";
@@ -15,6 +16,95 @@ import { CronOptions, Rule, Schedule } from "aws-cdk-lib/aws-events";
15
16
  import { LambdaFunction } from "aws-cdk-lib/aws-events-targets";
16
17
  import { Table } from "aws-cdk-lib/aws-dynamodb";
17
18
 
19
+ const isSubPath = (root: string, target: string): boolean => {
20
+ const relative = path.relative(path.resolve(root), path.resolve(target));
21
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
22
+ };
23
+
24
+ const LOCK_FILE_NAMES = ["pnpm-lock.yaml", "yarn.lock", "package-lock.json"];
25
+
26
+ const resolveProjectRoot = (projectRoot?: string): string | undefined => {
27
+ if (!projectRoot) {
28
+ return undefined;
29
+ }
30
+
31
+ return path.isAbsolute(projectRoot)
32
+ ? path.resolve(projectRoot)
33
+ : path.resolve(process.cwd(), projectRoot);
34
+ };
35
+
36
+ const findNearestLockFile = (startDir: string): string | undefined => {
37
+ let current = path.resolve(startDir);
38
+ const { root } = path.parse(current);
39
+
40
+ while (true) {
41
+ for (const candidate of LOCK_FILE_NAMES) {
42
+ const resolvedCandidate = path.join(current, candidate);
43
+ if (fs.existsSync(resolvedCandidate) && fs.statSync(resolvedCandidate).isFile()) {
44
+ return resolvedCandidate;
45
+ }
46
+ }
47
+
48
+ if (current === root) {
49
+ return undefined;
50
+ }
51
+
52
+ current = path.dirname(current);
53
+ }
54
+ };
55
+
56
+ const findCommonAncestor = (paths: string[]): string | undefined => {
57
+ if (paths.length === 0) {
58
+ return undefined;
59
+ }
60
+
61
+ let ancestor = path.resolve(paths[0]);
62
+
63
+ for (const currentPath of paths.slice(1)) {
64
+ const target = path.resolve(currentPath);
65
+ const ancestorRoot = path.parse(ancestor).root;
66
+
67
+ if (path.parse(ancestor).root.toLowerCase() !== path.parse(target).root.toLowerCase()) {
68
+ return undefined;
69
+ }
70
+
71
+ let candidate = ancestor;
72
+ while (!isSubPath(candidate, target)) {
73
+ if (candidate === ancestorRoot) {
74
+ candidate = ancestorRoot;
75
+ break;
76
+ }
77
+ candidate = path.dirname(candidate);
78
+ }
79
+
80
+ ancestor = candidate;
81
+ }
82
+
83
+ return ancestor;
84
+ };
85
+
86
+ const resolvePath = (inputPath: string, projectRoot?: string): string => {
87
+ if (path.isAbsolute(inputPath)) {
88
+ return path.resolve(inputPath);
89
+ }
90
+
91
+ const candidates: string[] = [];
92
+ if (projectRoot) {
93
+ candidates.push(path.resolve(projectRoot, inputPath));
94
+ }
95
+ candidates.push(path.resolve(process.cwd(), inputPath));
96
+
97
+ if (projectRoot) {
98
+ for (const candidate of candidates) {
99
+ if (isSubPath(projectRoot, candidate)) {
100
+ return candidate;
101
+ }
102
+ }
103
+ }
104
+
105
+ return candidates[candidates.length - 1];
106
+ };
107
+
18
108
  export const createBasicLambdaTimerJob = (
19
109
  scope: Construct,
20
110
  props: TimerJobProps
@@ -45,30 +135,67 @@ export const createBasicLambdaTimerJob = (
45
135
  };
46
136
 
47
137
  const createBasicLambdaProps = (props: TimerJobProps): NodejsFunctionProps => {
48
- let resolvedEntry: string;
49
-
50
- if (props.codePath && path.isAbsolute(props.codePath)) {
51
- resolvedEntry = props.codePath;
52
- } else if (props.codePath && props.projectRoot) {
53
- // codePath is relative, resolve from current directory + projectRoot
54
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
55
- } else if (props.projectRoot) {
56
- // No codePath, use default path with projectRoot
57
- resolvedEntry = path.resolve(
58
- process.cwd(),
59
- props.projectRoot,
60
- `resources/lambdas/timer-jobs/${props.functionName}/main.mts`
138
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
139
+ const defaultRelativeEntry = path.join(
140
+ "resources",
141
+ "lambdas",
142
+ "timer-jobs",
143
+ props.functionName,
144
+ "main.mts"
145
+ );
146
+ const entryPath = props.codePath ?? defaultRelativeEntry;
147
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
148
+
149
+ const cwd = path.resolve(process.cwd());
150
+ const entryDir = path.dirname(resolvedEntry);
151
+
152
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
153
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
154
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
155
+ if (!ancestor) {
156
+ throw new Error(
157
+ `Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`
158
+ );
159
+ }
160
+ effectiveProjectRoot = ancestor;
161
+ }
162
+
163
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
164
+ throw new Error(
165
+ `Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`
61
166
  );
62
- } else if (props.codePath) {
63
- // codePath without projectRoot
64
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
65
- } else {
66
- // Default path without projectRoot
67
- resolvedEntry = path.join(
68
- `./resources/lambdas/timer-jobs/${props.functionName}/main.mts`
167
+ }
168
+
169
+ let resolvedDepsLockFilePath = props.depsLockFilePath
170
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
171
+ : undefined;
172
+
173
+ if (!resolvedDepsLockFilePath) {
174
+ const potentialLockFiles = [
175
+ findNearestLockFile(entryDir),
176
+ findNearestLockFile(cwd),
177
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
178
+ ];
179
+
180
+ for (const lockFile of potentialLockFiles) {
181
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
182
+ resolvedDepsLockFilePath = lockFile;
183
+ break;
184
+ }
185
+ }
186
+ }
187
+
188
+ if (
189
+ resolvedDepsLockFilePath &&
190
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)
191
+ ) {
192
+ throw new Error(
193
+ `Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`
69
194
  );
70
195
  }
71
196
 
197
+ const environmentVars = props.envs ?? {};
198
+
72
199
  const lambdaProp: NodejsFunctionProps = {
73
200
  entry: resolvedEntry,
74
201
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
@@ -82,7 +209,7 @@ const createBasicLambdaProps = (props: TimerJobProps): NodejsFunctionProps => {
82
209
  ),
83
210
  memorySize: props.memory,
84
211
  environment: {
85
- ...props.envs,
212
+ ...environmentVars,
86
213
  },
87
214
  bundling: {
88
215
  minify: true,
@@ -90,15 +217,15 @@ const createBasicLambdaProps = (props: TimerJobProps): NodejsFunctionProps => {
90
217
  sourceMap: true,
91
218
  sourceMapMode: SourceMapMode.EXTERNAL,
92
219
  environment: {
93
- ...props.envs,
220
+ ...environmentVars,
94
221
  },
95
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
96
- ...(props.depsLockFilePath && {
97
- depsLockFilePath: props.depsLockFilePath,
98
- }),
99
222
  },
100
223
  role: props.role,
101
224
  layers: undefined,
225
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
226
+ ...(resolvedDepsLockFilePath && {
227
+ depsLockFilePath: resolvedDepsLockFilePath,
228
+ }),
102
229
  };
103
230
 
104
231
  return lambdaProp;