@sylvesterllc/aws-constructs 1.1.25 → 1.1.26

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,73 @@ 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
+ if (projectRoot) {
68
+ const candidateFromProjectRoot = path.resolve(projectRoot, inputPath);
69
+ if (isSubPath(projectRoot, candidateFromProjectRoot)) {
70
+ return candidateFromProjectRoot;
71
+ }
72
+ }
73
+ return path.resolve(process.cwd(), inputPath);
74
+ };
10
75
  const createBasicLambda = (scope, props) => {
11
76
  const lambdaProps = createBasicLambdaProps(props);
12
77
  let lambdaFunction = new aws_lambda_nodejs_1.NodejsFunction(scope, `${props.appPrefix || ""}${props.functionName}`, lambdaProps);
@@ -16,26 +81,44 @@ const createBasicLambda = (scope, props) => {
16
81
  };
17
82
  exports.createBasicLambda = createBasicLambda;
18
83
  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);
84
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
85
+ const defaultRelativeEntry = path.join("resources", "lambdas", props.functionName, "main.mts");
86
+ const entryPath = props.codePath ?? defaultRelativeEntry;
87
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
88
+ const cwd = path.resolve(process.cwd());
89
+ const entryDir = path.dirname(resolvedEntry);
90
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
91
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
92
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
93
+ if (!ancestor) {
94
+ throw new Error(`Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`);
95
+ }
96
+ effectiveProjectRoot = ancestor;
26
97
  }
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`);
98
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
99
+ throw new Error(`Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`);
30
100
  }
31
- else if (props.codePath) {
32
- // codePath without projectRoot
33
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
101
+ let resolvedDepsLockFilePath = props.depsLockFilePath
102
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
103
+ : undefined;
104
+ if (!resolvedDepsLockFilePath) {
105
+ const potentialLockFiles = [
106
+ findNearestLockFile(entryDir),
107
+ findNearestLockFile(cwd),
108
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
109
+ ];
110
+ for (const lockFile of potentialLockFiles) {
111
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
112
+ resolvedDepsLockFilePath = lockFile;
113
+ break;
114
+ }
115
+ }
34
116
  }
35
- else {
36
- // Default path without projectRoot
37
- resolvedEntry = path.join(`./resources/lambdas/${props.functionName}/main.mts`);
117
+ if (resolvedDepsLockFilePath &&
118
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)) {
119
+ throw new Error(`Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`);
38
120
  }
121
+ const environmentVars = props.envs ?? {};
39
122
  const lambdaProp = {
40
123
  entry: resolvedEntry,
41
124
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${props.functionName}`,
@@ -45,7 +128,7 @@ const createBasicLambdaProps = (props) => {
45
128
  timeout: aws_cdk_lib_1.Duration.minutes(props.timeoutInMinutes ? props.timeoutInMinutes : 1),
46
129
  memorySize: props.memory,
47
130
  environment: {
48
- ...props.envs,
131
+ ...environmentVars,
49
132
  },
50
133
  bundling: {
51
134
  minify: true,
@@ -53,15 +136,15 @@ const createBasicLambdaProps = (props) => {
53
136
  sourceMap: true,
54
137
  sourceMapMode: aws_lambda_nodejs_1.SourceMapMode.EXTERNAL,
55
138
  environment: {
56
- ...props.envs,
139
+ ...environmentVars,
57
140
  },
58
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
59
- ...(props.depsLockFilePath && {
60
- depsLockFilePath: props.depsLockFilePath,
61
- }),
62
141
  },
63
142
  role: props.role,
64
143
  layers: undefined,
144
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
145
+ ...(resolvedDepsLockFilePath && {
146
+ depsLockFilePath: resolvedDepsLockFilePath,
147
+ }),
65
148
  };
66
149
  return lambdaProp;
67
150
  };
@@ -81,4 +164,4 @@ const addLambdaLayers = (scope, lambda, layerArns) => {
81
164
  });
82
165
  }
83
166
  };
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL2xhbWJkYS9jcmVhdGUtYmFzaWMtbGFtYmRhLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFFdkMsdURBQStEO0FBQy9ELHFFQUl1QztBQUN2QyxtREFBcUQ7QUFDckQsNkJBQThCO0FBRzlCLDJEQUFpRDtBQUUxQyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLEtBQWdCLEVBQ2hCLEtBQWtCLEVBQ0YsRUFBRTtJQUNsQixNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVsRCxJQUFJLGNBQWMsR0FBRyxJQUFJLGtDQUFjLENBQ3JDLEtBQUssRUFDTCxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFDL0MsV0FBVyxDQUNaLENBQUM7SUFFRix5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXpFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU3RCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDLENBQUM7QUFqQlcsUUFBQSxpQkFBaUIscUJBaUI1QjtBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFrQixFQUF1QixFQUFFO0lBQ3pFLElBQUksYUFBcUIsQ0FBQztJQUUxQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFX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QixTQUFvQixFQUNwQixFQUFFO0lBQ0YsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLHlCQUFZLENBQUMsbUJBQW1CLENBQzVDLEtBQUssRUFDTCxnQkFBZ0IsR0FBRyxFQUFFLEVBQ3JCLEdBQUcsQ0FDSixDQUFDO1lBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcclxuaW1wb3J0IHsgTGF5ZXJWZXJzaW9uLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcclxuaW1wb3J0IHtcclxuICBOb2RlanNGdW5jdGlvbixcclxuICBOb2RlanNGdW5jdGlvblByb3BzLFxyXG4gIFNvdXJjZU1hcE1vZGUsXHJcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XHJcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcclxuaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuaW1wb3J0IHsgTGFtYmRhUHJvcHMgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9sYW1iZGFcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzaWNMYW1iZGEgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBwcm9wczogTGFtYmRhUHJvcHNcclxuKTogTm9kZWpzRnVuY3Rpb24gPT4ge1xyXG4gIGNvbnN0IGxhbWJkYVByb3BzID0gY3JlYXRlQmFzaWNMYW1iZGFQcm9wcyhwcm9wcyk7XHJcblxyXG4gIGxldCBsYW1iZGFGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbihcclxuICAgIHNjb3BlLFxyXG4gICAgYCR7cHJvcHMuYXBwUHJlZml4IHx8IFwiXCJ9JHtwcm9wcy5mdW5jdGlvbk5hbWV9YCxcclxuICAgIGxhbWJkYVByb3BzXHJcbiAgKTtcclxuXHJcbiAgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyhzY29wZSwgbGFtYmRhRnVuY3Rpb24sIHByb3BzLmR5bmFtb1RhYmxlTmFtZXMpO1xyXG5cclxuICBhZGRMYW1iZGFMYXllcnMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5sYW1iZGFMYXllckFybik7XHJcblxyXG4gIHJldHVybiBsYW1iZGFGdW5jdGlvbjtcclxufTtcclxuXHJcbmNvbnN0IGNyZWF0ZUJhc2ljTGFtYmRhUHJvcHMgPSAocHJvcHM6IExhbWJkYVByb3BzKTogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9PiB7XHJcbiAgbGV0IHJlc29sdmVkRW50cnk6IHN0cmluZztcclxuXHJcbiAgaWYgKHByb3BzLmNvZGVQYXRoICYmIHBhdGguaXNBYnNvbHV0ZShwcm9wcy5jb2RlUGF0aCkpIHtcclxuICAgIHJlc29sdmVkRW50cnkgPSBwcm9wcy5jb2RlUGF0aDtcclxuICB9IGVsc2UgaWYgKHByb3BzLmNvZGVQYXRoICYmIHByb3BzLnByb2plY3RSb290KSB7XHJcbiAgICAvLyBjb2RlUGF0aCBpcyByZWxhdGl2ZSwgcmVzb2x2ZSBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5ICsgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvcHMuY29kZVBhdGgpO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMucHJvamVjdFJvb3QpIHtcclxuICAgIC8vIE5vIGNvZGVQYXRoLCB1c2UgZGVmYXVsdCBwYXRoIHdpdGggcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUoXHJcbiAgICAgIHByb2Nlc3MuY3dkKCksXHJcbiAgICAgIHByb3BzLnByb2plY3RSb290LFxyXG4gICAgICBgcmVzb3VyY2VzL2xhbWJkYXMvJHtwcm9wcy5mdW5jdGlvbk5hbWV9L21haW4ubXRzYFxyXG4gICAgKTtcclxuICB9IGVsc2UgaWYgKHByb3BzLmNvZGVQYXRoKSB7XHJcbiAgICAvLyBjb2RlUGF0aCB3aXRob3V0IHByb2plY3RSb290XHJcbiAgICByZXNvbHZlZEVudHJ5ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHByb3BzLmNvZGVQYXRoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gRGVmYXVsdCBwYXRoIHdpdGhvdXQgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLmpvaW4oXHJcbiAgICAgIGAuL3Jlc291cmNlcy9sYW1iZGFzLyR7cHJvcHMuZnVuY3Rpb25OYW1lfS9tYWluLm10c2BcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBsYW1iZGFQcm9wOiBOb2RlanNGdW5jdGlvblByb3BzID0ge1xyXG4gICAgZW50cnk6IHJlc29sdmVkRW50cnksXHJcbiAgICBmdW5jdGlvbk5hbWU6IGAke3Byb3BzLmFwcFByZWZpeCA/IGAke3Byb3BzLmFwcFByZWZpeH0tYCA6IFwiXCJ9JHtcclxuICAgICAgcHJvcHMuZnVuY3Rpb25OYW1lXHJcbiAgICB9YCxcclxuICAgIGhhbmRsZXI6IFwibWFpbi50c1wiLFxyXG4gICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcclxuICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTX0xBVEVTVCxcclxuICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoXHJcbiAgICAgIHByb3BzLnRpbWVvdXRJbk1pbnV0ZXMgPyBwcm9wcy50aW1lb3V0SW5NaW51dGVzIDogMVxyXG4gICAgKSxcclxuICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeSxcclxuICAgIGVudmlyb25tZW50OiB7XHJcbiAgICAgIC4uLnByb3BzLmVudnMsXHJcbiAgICB9LFxyXG4gICAgYnVuZGxpbmc6IHtcclxuICAgICAgbWluaWZ5OiB0cnVlLFxyXG4gICAgICB0YXJnZXQ6IGBlc25leHRgLFxyXG4gICAgICBzb3VyY2VNYXA6IHRydWUsXHJcbiAgICAgIHNvdXJjZU1hcE1vZGU6IFNvdXJjZU1hcE1vZGUuRVhURVJOQUwsXHJcbiAgICAgIGVudmlyb25tZW50OiB7XHJcbiAgICAgICAgLi4ucHJvcHMuZW52cyxcclxuICAgICAgfSxcclxuICAgICAgLi4uKHByb3BzLnByb2plY3RSb290ICYmIHsgcHJvamVjdFJvb3Q6IHByb3BzLnByb2plY3RSb290IH0pLFxyXG4gICAgICAuLi4ocHJvcHMuZGVwc0xvY2tGaWxlUGF0aCAmJiB7XHJcbiAgICAgICAgZGVwc0xvY2tGaWxlUGF0aDogcHJvcHMuZGVwc0xvY2tGaWxlUGF0aCxcclxuICAgICAgfSksXHJcbiAgICB9LFxyXG4gICAgcm9sZTogcHJvcHMucm9sZSxcclxuICAgIGxheWVyczogdW5kZWZpbmVkLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBsYW1iZGFQcm9wO1xyXG59O1xyXG5cclxuY29uc3QgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgdGFibGVOYW1lcz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmICh0YWJsZU5hbWVzICYmIHRhYmxlTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgdGFibGVOYW1lcy5mb3JFYWNoKCh0YWJsZU5hbWUpID0+IHtcclxuICAgICAgY29uc3QgdGFibGUgPSBUYWJsZS5mcm9tVGFibGVOYW1lKHNjb3BlLCBgJHt0YWJsZU5hbWV9LXRhYmxlYCwgdGFibGVOYW1lKTtcclxuXHJcbiAgICAgIHRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYWRkTGFtYmRhTGF5ZXJzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICBsYXllckFybnM/OiBzdHJpbmdbXVxyXG4pID0+IHtcclxuICBpZiAobGF5ZXJBcm5zICYmIGxheWVyQXJucy5sZW5ndGggPiAwKSB7XHJcbiAgICBsYXllckFybnMuZm9yRWFjaCgoYXJuOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXHJcbiAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgYGNvbW1vbi1sYXllci0ke2lkeH1gLFxyXG4gICAgICAgIGFyblxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGFtYmRhLmFkZExheWVycyhsYXllcik7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ==
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL2xhbWJkYS9jcmVhdGUtYmFzaWMtbGFtYmRhLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFFdkMsdURBQStEO0FBQy9ELHFFQUl1QztBQUN2QyxtREFBcUQ7QUFDckQseUJBQTBCO0FBQzFCLDZCQUE4QjtBQUc5QiwyREFBaUQ7QUFFakQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsTUFBYyxFQUFXLEVBQUU7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RSxPQUFPLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDdkYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztBQUU3RSxNQUFNLGtCQUFrQixHQUFHLENBQUMsV0FBb0IsRUFBc0IsRUFBRTtJQUN0RSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMv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LENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xyXG5pbXBvcnQgeyBMYXllclZlcnNpb24sIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQge1xyXG4gIE5vZGVqc0Z1bmN0aW9uLFxyXG4gIE5vZGVqc0Z1bmN0aW9uUHJvcHMsXHJcbiAgU291cmNlTWFwTW9kZSxcclxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcclxuaW1wb3J0IHsgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xyXG5pbXBvcnQgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmltcG9ydCB7IExhbWJkYVByb3BzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvbGFtYmRhXCI7XHJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xyXG5cclxuY29uc3QgaXNTdWJQYXRoID0gKHJvb3Q6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKHJvb3QpLCBwYXRoLnJlc29sdmUodGFyZ2V0KSk7XHJcbiAgcmV0dXJuIHJlbGF0aXZlID09PSBcIlwiIHx8ICghcmVsYXRpdmUuc3RhcnRzV2l0aChcIi4uXCIpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmUpKTtcclxufTtcclxuXHJcbmNvbnN0IExPQ0tfRklMRV9OQU1FUyA9IFtcInBucG0tbG9jay55YW1sXCIsIFwieWFybi5sb2NrXCIsIFwicGFja2FnZS1sb2NrLmpzb25cIl07XHJcblxyXG5jb25zdCByZXNvbHZlUHJvamVjdFJvb3QgPSAocHJvamVjdFJvb3Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xyXG4gIGlmICghcHJvamVjdFJvb3QpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKHByb2plY3RSb290KVxyXG4gICAgPyBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QpXHJcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBwcm9qZWN0Um9vdCk7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kTmVhcmVzdExvY2tGaWxlID0gKHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xyXG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyKTtcclxuICBjb25zdCB7IHJvb3QgfSA9IHBhdGgucGFyc2UoY3VycmVudCk7XHJcblxyXG4gIHdoaWxlICh0cnVlKSB7XHJcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBMT0NLX0ZJTEVfTkFNRVMpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWRDYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudCwgY2FuZGlkYXRlKTtcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRDYW5kaWRhdGUpICYmIGZzLnN0YXRTeW5jKHJlc29sdmVkQ2FuZGlkYXRlKS5pc0ZpbGUoKSkge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlZENhbmRpZGF0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyZW50ID09PSByb290KSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQ29tbW9uQW5jZXN0b3IgPSAocGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbGV0IGFuY2VzdG9yID0gcGF0aC5yZXNvbHZlKHBhdGhzWzBdKTtcclxuXHJcbiAgZm9yIChjb25zdCBjdXJyZW50UGF0aCBvZiBwYXRocy5zbGljZSgxKSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gcGF0aC5yZXNvbHZlKGN1cnJlbnRQYXRoKTtcclxuICAgIGNvbnN0IGFuY2VzdG9yUm9vdCA9IHBhdGgucGFyc2UoYW5jZXN0b3IpLnJvb3Q7XHJcblxyXG4gICAgaWYgKHBhdGgucGFyc2UoYW5jZXN0b3IpLnJvb3QudG9Mb3dlckNhc2UoKSAhPT0gcGF0aC5wYXJzZSh0YXJnZXQpLnJvb3QudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjYW5kaWRhdGUgPSBhbmNlc3RvcjtcclxuICAgIHdoaWxlICghaXNTdWJQYXRoKGNhbmRpZGF0ZSwgdGFyZ2V0KSkge1xyXG4gICAgICBpZiAoY2FuZGlkYXRlID09PSBhbmNlc3RvclJvb3QpIHtcclxuICAgICAgICBjYW5kaWRhdGUgPSBhbmNlc3RvclJvb3Q7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FuZGlkYXRlID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYW5jZXN0b3IgPSBjYW5kaWRhdGU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gYW5jZXN0b3I7XHJcbn07XHJcblxyXG5jb25zdCByZXNvbHZlUGF0aCA9IChpbnB1dFBhdGg6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoaW5wdXRQYXRoKSkge1xyXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShpbnB1dFBhdGgpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHByb2plY3RSb290KSB7XHJcbiAgICBjb25zdCBjYW5kaWRhdGVGcm9tUHJvamVjdFJvb3QgPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIGlucHV0UGF0aCk7XHJcbiAgICBpZiAoaXNTdWJQYXRoKHByb2plY3RSb290LCBjYW5kaWRhdGVGcm9tUHJvamVjdFJvb3QpKSB7XHJcbiAgICAgIHJldHVybiBjYW5kaWRhdGVGcm9tUHJvamVjdFJvb3Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGlucHV0UGF0aCk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzaWNMYW1iZGEgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBwcm9wczogTGFtYmRhUHJvcHNcclxuKTogTm9kZWpzRnVuY3Rpb24gPT4ge1xyXG4gIGNvbnN0IGxhbWJkYVByb3BzID0gY3JlYXRlQmFzaWNMYW1iZGFQcm9wcyhwcm9wcyk7XHJcblxyXG4gIGxldCBsYW1iZGFGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbihcclxuICAgIHNjb3BlLFxyXG4gICAgYCR7cHJvcHMuYXBwUHJlZml4IHx8IFwiXCJ9JHtwcm9wcy5mdW5jdGlvbk5hbWV9YCxcclxuICAgIGxhbWJkYVByb3BzXHJcbiAgKTtcclxuXHJcbiAgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyhzY29wZSwgbGFtYmRhRnVuY3Rpb24sIHByb3BzLmR5bmFtb1RhYmxlTmFtZXMpO1xyXG5cclxuICBhZGRMYW1iZGFMYXllcnMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5sYW1iZGFMYXllckFybik7XHJcblxyXG4gIHJldHVybiBsYW1iZGFGdW5jdGlvbjtcclxufTtcclxuXHJcbmNvbnN0IGNyZWF0ZUJhc2ljTGFtYmRhUHJvcHMgPSAocHJvcHM6IExhbWJkYVByb3BzKTogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9PiB7XHJcbiAgY29uc3QgcmVzb2x2ZWRQcm9qZWN0Um9vdCA9IHJlc29sdmVQcm9qZWN0Um9vdChwcm9wcy5wcm9qZWN0Um9vdCk7XHJcbiAgY29uc3QgZGVmYXVsdFJlbGF0aXZlRW50cnkgPSBwYXRoLmpvaW4oXHJcbiAgICBcInJlc291cmNlc1wiLFxyXG4gICAgXCJsYW1iZGFzXCIsXHJcbiAgICBwcm9wcy5mdW5jdGlvbk5hbWUsXHJcbiAgICBcIm1haW4ubXRzXCJcclxuICApO1xyXG4gIGNvbnN0IGVudHJ5UGF0aCA9IHByb3BzLmNvZGVQYXRoID8/IGRlZmF1bHRSZWxhdGl2ZUVudHJ5O1xyXG4gIGNvbnN0IHJlc29sdmVkRW50cnkgPSByZXNvbHZlUGF0aChlbnRyeVBhdGgsIHJlc29sdmVkUHJvamVjdFJvb3QpO1xyXG5cclxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XHJcbiAgY29uc3QgZW50cnlEaXIgPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWRFbnRyeSk7XHJcblxyXG4gIGxldCBlZmZlY3RpdmVQcm9qZWN0Um9vdCA9IHJlc29sdmVkUHJvamVjdFJvb3QgPz8gY3dkO1xyXG4gIGlmICghaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZEVudHJ5KSkge1xyXG4gICAgY29uc3QgYW5jZXN0b3IgPSBmaW5kQ29tbW9uQW5jZXN0b3IoW2VmZmVjdGl2ZVByb2plY3RSb290LCBlbnRyeURpcl0pO1xyXG4gICAgaWYgKCFhbmNlc3Rvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYFVuYWJsZSB0byBkZXRlcm1pbmUgYSBwcm9qZWN0Um9vdCB0aGF0IGNvbnRhaW5zIGJvdGggJHtlZmZlY3RpdmVQcm9qZWN0Um9vdH0gYW5kICR7cmVzb2x2ZWRFbnRyeX0uYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgZWZmZWN0aXZlUHJvamVjdFJvb3QgPSBhbmNlc3RvcjtcclxuICB9XHJcblxyXG4gIGlmICghaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZEVudHJ5KSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICBgUmVzb2x2ZWQgbGFtYmRhIGVudHJ5ICR7cmVzb2x2ZWRFbnRyeX0gbXVzdCBiZSBsb2NhdGVkIHdpdGhpbiBwcm9qZWN0Um9vdCAke2VmZmVjdGl2ZVByb2plY3RSb290fS5gXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCA9IHByb3BzLmRlcHNMb2NrRmlsZVBhdGhcclxuICAgID8gcmVzb2x2ZVBhdGgocHJvcHMuZGVwc0xvY2tGaWxlUGF0aCwgcmVzb2x2ZWRQcm9qZWN0Um9vdClcclxuICAgIDogdW5kZWZpbmVkO1xyXG5cclxuICBpZiAoIXJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCkge1xyXG4gICAgY29uc3QgcG90ZW50aWFsTG9ja0ZpbGVzID0gW1xyXG4gICAgICBmaW5kTmVhcmVzdExvY2tGaWxlKGVudHJ5RGlyKSxcclxuICAgICAgZmluZE5lYXJlc3RMb2NrRmlsZShjd2QpLFxyXG4gICAgICBlZmZlY3RpdmVQcm9qZWN0Um9vdCAhPT0gY3dkID8gZmluZE5lYXJlc3RMb2NrRmlsZShlZmZlY3RpdmVQcm9qZWN0Um9vdCkgOiB1bmRlZmluZWQsXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAoY29uc3QgbG9ja0ZpbGUgb2YgcG90ZW50aWFsTG9ja0ZpbGVzKSB7XHJcbiAgICAgIGlmIChsb2NrRmlsZSAmJiBpc1N1YlBhdGgoZWZmZWN0aXZlUHJvamVjdFJvb3QsIGxvY2tGaWxlKSkge1xyXG4gICAgICAgIHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCA9IGxvY2tGaWxlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGggJiZcclxuICAgICFpc1N1YlBhdGgoZWZmZWN0aXZlUHJvamVjdFJvb3QsIHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aClcclxuICApIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYFJlc29sdmVkIGRlcHNMb2NrRmlsZVBhdGggJHtyZXNvbHZlZERlcHNMb2NrRmlsZVBhdGh9IG11c3QgYmUgbG9jYXRlZCB3aXRoaW4gcHJvamVjdFJvb3QgJHtlZmZlY3RpdmVQcm9qZWN0Um9vdH0uYFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGVudmlyb25tZW50VmFycyA9IHByb3BzLmVudnMgPz8ge307XHJcblxyXG4gIGNvbnN0IGxhbWJkYVByb3A6IE5vZGVqc0Z1bmN0aW9uUHJvcHMgPSB7XHJcbiAgICBlbnRyeTogcmVzb2x2ZWRFbnRyeSxcclxuICAgIGZ1bmN0aW9uTmFtZTogYCR7cHJvcHMuYXBwUHJlZml4ID8gYCR7cHJvcHMuYXBwUHJlZml4fS1gIDogXCJcIn0ke1xyXG4gICAgICBwcm9wcy5mdW5jdGlvbk5hbWVcclxuICAgIH1gLFxyXG4gICAgaGFuZGxlcjogXCJtYWluLnRzXCIsXHJcbiAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxyXG4gICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfTEFURVNULFxyXG4gICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyhcclxuICAgICAgcHJvcHMudGltZW91dEluTWludXRlcyA/IHByb3BzLnRpbWVvdXRJbk1pbnV0ZXMgOiAxXHJcbiAgICApLFxyXG4gICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5LFxyXG4gICAgZW52aXJvbm1lbnQ6IHtcclxuICAgICAgLi4uZW52aXJvbm1lbnRWYXJzLFxyXG4gICAgfSxcclxuICAgIGJ1bmRsaW5nOiB7XHJcbiAgICAgIG1pbmlmeTogdHJ1ZSxcclxuICAgICAgdGFyZ2V0OiBgZXNuZXh0YCxcclxuICAgICAgc291cmNlTWFwOiB0cnVlLFxyXG4gICAgICBzb3VyY2VNYXBNb2RlOiBTb3VyY2VNYXBNb2RlLkVYVEVSTkFMLFxyXG4gICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgIC4uLmVudmlyb25tZW50VmFycyxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICByb2xlOiBwcm9wcy5yb2xlLFxyXG4gICAgbGF5ZXJzOiB1bmRlZmluZWQsXHJcbiAgICAuLi4oZWZmZWN0aXZlUHJvamVjdFJvb3QgJiYgeyBwcm9qZWN0Um9vdDogZWZmZWN0aXZlUHJvamVjdFJvb3QgfSksXHJcbiAgICAuLi4ocmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRoICYmIHtcclxuICAgICAgZGVwc0xvY2tGaWxlUGF0aDogcmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRoLFxyXG4gICAgfSksXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIGxhbWJkYVByb3A7XHJcbn07XHJcblxyXG5jb25zdCBncmFudEFjY2Vzc1RvRHluYW1vVGFibGVzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICB0YWJsZU5hbWVzPzogc3RyaW5nW11cclxuKSA9PiB7XHJcbiAgaWYgKHRhYmxlTmFtZXMgJiYgdGFibGVOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICB0YWJsZU5hbWVzLmZvckVhY2goKHRhYmxlTmFtZSkgPT4ge1xyXG4gICAgICBjb25zdCB0YWJsZSA9IFRhYmxlLmZyb21UYWJsZU5hbWUoc2NvcGUsIGAke3RhYmxlTmFtZX0tdGFibGVgLCB0YWJsZU5hbWUpO1xyXG5cclxuICAgICAgdGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGxhbWJkYSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBhZGRMYW1iZGFMYXllcnMgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uLFxyXG4gIGxheWVyQXJucz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmIChsYXllckFybnMgJiYgbGF5ZXJBcm5zLmxlbmd0aCA+IDApIHtcclxuICAgIGxheWVyQXJucy5mb3JFYWNoKChhcm46IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgbGF5ZXIgPSBMYXllclZlcnNpb24uZnJvbUxheWVyVmVyc2lvbkFybihcclxuICAgICAgICBzY29wZSxcclxuICAgICAgICBgY29tbW9uLWxheWVyLSR7aWR4fWAsXHJcbiAgICAgICAgYXJuXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsYW1iZGEuYWRkTGF5ZXJzKGxheWVyKTtcclxuICAgIH0pO1xyXG4gIH1cclxufTtcclxuIl19
@@ -6,11 +6,76 @@ 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
+ if (projectRoot) {
72
+ const candidateFromProjectRoot = path.resolve(projectRoot, inputPath);
73
+ if (isSubPath(projectRoot, candidateFromProjectRoot)) {
74
+ return candidateFromProjectRoot;
75
+ }
76
+ }
77
+ return path.resolve(process.cwd(), inputPath);
78
+ };
14
79
  const createBasicLambdaTimerJob = (scope, props) => {
15
80
  const lambdaProps = createBasicLambdaProps(props);
16
81
  let lambdaFunction = new aws_lambda_nodejs_1.NodejsFunction(scope, `${props.appPrefix}${props.functionName}`, lambdaProps);
@@ -23,26 +88,44 @@ const createBasicLambdaTimerJob = (scope, props) => {
23
88
  };
24
89
  exports.createBasicLambdaTimerJob = createBasicLambdaTimerJob;
25
90
  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);
91
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
92
+ const defaultRelativeEntry = path.join("resources", "lambdas", "timer-jobs", props.functionName, "main.mts");
93
+ const entryPath = props.codePath ?? defaultRelativeEntry;
94
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
95
+ const cwd = path.resolve(process.cwd());
96
+ const entryDir = path.dirname(resolvedEntry);
97
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
98
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
99
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
100
+ if (!ancestor) {
101
+ throw new Error(`Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`);
102
+ }
103
+ effectiveProjectRoot = ancestor;
33
104
  }
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`);
105
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
106
+ throw new Error(`Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`);
37
107
  }
38
- else if (props.codePath) {
39
- // codePath without projectRoot
40
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
108
+ let resolvedDepsLockFilePath = props.depsLockFilePath
109
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
110
+ : undefined;
111
+ if (!resolvedDepsLockFilePath) {
112
+ const potentialLockFiles = [
113
+ findNearestLockFile(entryDir),
114
+ findNearestLockFile(cwd),
115
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
116
+ ];
117
+ for (const lockFile of potentialLockFiles) {
118
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
119
+ resolvedDepsLockFilePath = lockFile;
120
+ break;
121
+ }
122
+ }
41
123
  }
42
- else {
43
- // Default path without projectRoot
44
- resolvedEntry = path.join(`./resources/lambdas/timer-jobs/${props.functionName}/main.mts`);
124
+ if (resolvedDepsLockFilePath &&
125
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)) {
126
+ throw new Error(`Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`);
45
127
  }
128
+ const environmentVars = props.envs ?? {};
46
129
  const lambdaProp = {
47
130
  entry: resolvedEntry,
48
131
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${props.functionName}`,
@@ -52,7 +135,7 @@ const createBasicLambdaProps = (props) => {
52
135
  timeout: aws_cdk_lib_1.Duration.minutes(props.timeoutInMinutes ? props.timeoutInMinutes : 1),
53
136
  memorySize: props.memory,
54
137
  environment: {
55
- ...props.envs,
138
+ ...environmentVars,
56
139
  },
57
140
  bundling: {
58
141
  minify: true,
@@ -60,15 +143,15 @@ const createBasicLambdaProps = (props) => {
60
143
  sourceMap: true,
61
144
  sourceMapMode: aws_lambda_nodejs_1.SourceMapMode.EXTERNAL,
62
145
  environment: {
63
- ...props.envs,
146
+ ...environmentVars,
64
147
  },
65
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
66
- ...(props.depsLockFilePath && {
67
- depsLockFilePath: props.depsLockFilePath,
68
- }),
69
148
  },
70
149
  role: props.role,
71
150
  layers: undefined,
151
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
152
+ ...(resolvedDepsLockFilePath && {
153
+ depsLockFilePath: resolvedDepsLockFilePath,
154
+ }),
72
155
  };
73
156
  return lambdaProp;
74
157
  };
@@ -99,4 +182,4 @@ const addLambdaLayers = (scope, lambda, layerArns) => {
99
182
  });
100
183
  }
101
184
  };
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvbGFtYmRhL2NyZWF0ZS1iYXNpYy1sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUF1RDtBQUN2RCx1REFBK0Q7QUFDL0QscUVBSXVDO0FBQ3ZDLG1EQUFxRDtBQUNyRCw2QkFBOEI7QUFHOUIscUdBQW9GO0FBQ3BGLHVEQUFxRTtBQUNyRSx1RUFBZ0U7QUFDaEUsMkRBQWlEO0FBRTFDLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsS0FBZ0IsRUFDaEIsS0FBb0IsRUFDSixFQUFFO0lBQ2xCLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxELElBQUksY0FBYyxHQUFHLElBQUksa0NBQWMsQ0FDckMsS0FBSyxFQUNMLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQ3pDLFdBQVcsQ0FDWixDQUFDO0lBRUYsb0NBQW9DLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFckQsTUFBTSxTQUFTLEdBQUcsd0JBQXdCLENBQ3hDLEtBQUssRUFDTCxjQUFjLEVBQ2QsS0FBSyxDQUFDLFdBQVcsQ0FDbEIsQ0FBQztJQUVGLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxtQ0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFeEQseUJBQXlCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUV6RSxlQUFlLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFN0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBM0JXLFFBQUEseUJBQXlCLDZCQTJCcEM7QUFFRixNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBb0IsRUFB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QUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xyXG5pbXBvcnQgeyBMYXllclZlcnNpb24sIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQge1xyXG4gIE5vZGVqc0Z1bmN0aW9uLFxyXG4gIE5vZGVqc0Z1bmN0aW9uUHJvcHMsXHJcbiAgU291cmNlTWFwTW9kZSxcclxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcclxuaW1wb3J0IHsgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xyXG5pbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5pbXBvcnQgeyBUaW1lckpvYlByb3BzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdGltZXItam9iXCI7XHJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XHJcbmltcG9ydCB7IFNFUlZJQ0VfUFJJTkNJUEFMIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9hd3Mtc2VydmljZS1wcmluY2lwYWwtY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IENyb25PcHRpb25zLCBSdWxlLCBTY2hlZHVsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XHJcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVCYXNpY0xhbWJkYVRpbWVySm9iID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgcHJvcHM6IFRpbWVySm9iUHJvcHNcclxuKTogTm9kZWpzRnVuY3Rpb24gPT4ge1xyXG4gIGNvbnN0IGxhbWJkYVByb3BzID0gY3JlYXRlQmFzaWNMYW1iZGFQcm9wcyhwcm9wcyk7XHJcblxyXG4gIGxldCBsYW1iZGFGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbihcclxuICAgIHNjb3BlLFxyXG4gICAgYCR7cHJvcHMuYXBwUHJlZml4fSR7cHJvcHMuZnVuY3Rpb25OYW1lfWAsXHJcbiAgICBsYW1iZGFQcm9wc1xyXG4gICk7XHJcblxyXG4gIGFkZEludm9rZVBlcm1pc3Npb25Ub0xhbWJkYUZvckV2ZW50cyhsYW1iZGFGdW5jdGlvbik7XHJcblxyXG4gIGNvbnN0IGV2ZW50UnVsZSA9IGNyZWF0ZUV2ZW50UnVsZUZvckxhbWJkYShcclxuICAgIHNjb3BlLFxyXG4gICAgbGFtYmRhRnVuY3Rpb24sXHJcbiAgICBwcm9wcy5jcm9uT3B0aW9uc1xyXG4gICk7XHJcblxyXG4gIGV2ZW50UnVsZS5hZGRUYXJnZXQobmV3IExhbWJkYUZ1bmN0aW9uKGxhbWJkYUZ1bmN0aW9uKSk7XHJcblxyXG4gIGdyYW50QWNjZXNzVG9EeW5hbW9UYWJsZXMoc2NvcGUsIGxhbWJkYUZ1bmN0aW9uLCBwcm9wcy5keW5hbW9UYWJsZU5hbWVzKTtcclxuXHJcbiAgYWRkTGFtYmRhTGF5ZXJzKHNjb3BlLCBsYW1iZGFGdW5jdGlvbiwgcHJvcHMubGFtYmRhTGF5ZXJBcm4pO1xyXG5cclxuICByZXR1cm4gbGFtYmRhRnVuY3Rpb247XHJcbn07XHJcblxyXG5jb25zdCBjcmVhdGVCYXNpY0xhbWJkYVByb3BzID0gKHByb3BzOiBUaW1lckpvYlByb3BzKTogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9PiB7XHJcbiAgbGV0IHJlc29sdmVkRW50cnk6IHN0cmluZztcclxuXHJcbiAgaWYgKHByb3BzLmNvZGVQYXRoICYmIHBhdGguaXNBYnNvbHV0ZShwcm9wcy5jb2RlUGF0aCkpIHtcclxuICAgIHJlc29sdmVkRW50cnkgPSBwcm9wcy5jb2RlUGF0aDtcclxuICB9IGVsc2UgaWYgKHByb3BzLmNvZGVQYXRoICYmIHByb3BzLnByb2plY3RSb290KSB7XHJcbiAgICAvLyBjb2RlUGF0aCBpcyByZWxhdGl2ZSwgcmVzb2x2ZSBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5ICsgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvcHMuY29kZVBhdGgpO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMucHJvamVjdFJvb3QpIHtcclxuICAgIC8vIE5vIGNvZGVQYXRoLCB1c2UgZGVmYXVsdCBwYXRoIHdpdGggcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUoXHJcbiAgICAgIHByb2Nlc3MuY3dkKCksXHJcbiAgICAgIHByb3BzLnByb2plY3RSb290LFxyXG4gICAgICBgcmVzb3VyY2VzL2xhbWJkYXMvdGltZXItam9icy8ke3Byb3BzLmZ1bmN0aW9uTmFtZX0vbWFpbi5tdHNgXHJcbiAgICApO1xyXG4gIH0gZWxzZSBpZiAocHJvcHMuY29kZVBhdGgpIHtcclxuICAgIC8vIGNvZGVQYXRoIHdpdGhvdXQgcHJvamVjdFJvb3RcclxuICAgIHJlc29sdmVkRW50cnkgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcHJvcHMuY29kZVBhdGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBEZWZhdWx0IHBhdGggd2l0aG91dCBwcm9qZWN0Um9vdFxyXG4gICAgcmVzb2x2ZWRFbnRyeSA9IHBhdGguam9pbihcclxuICAgICAgYC4vcmVzb3VyY2VzL2xhbWJkYXMvdGltZXItam9icy8ke3Byb3BzLmZ1bmN0aW9uTmFtZX0vbWFpbi5tdHNgXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbGFtYmRhUHJvcDogTm9kZWpzRnVuY3Rpb25Qcm9wcyA9IHtcclxuICAgIGVudHJ5OiByZXNvbHZlZEVudHJ5LFxyXG4gICAgZnVuY3Rpb25OYW1lOiBgJHtwcm9wcy5hcHBQcmVmaXggPyBgJHtwcm9wcy5hcHBQcmVmaXh9LWAgOiBcIlwifSR7XHJcbiAgICAgIHByb3BzLmZ1bmN0aW9uTmFtZVxyXG4gICAgfWAsXHJcbiAgICBoYW5kbGVyOiBcIm1haW4udHNcIixcclxuICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXHJcbiAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU19MQVRFU1QsXHJcbiAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKFxyXG4gICAgICBwcm9wcy50aW1lb3V0SW5NaW51dGVzID8gcHJvcHMudGltZW91dEluTWludXRlcyA6IDFcclxuICAgICksXHJcbiAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnksXHJcbiAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAuLi5wcm9wcy5lbnZzLFxyXG4gICAgfSxcclxuICAgIGJ1bmRsaW5nOiB7XHJcbiAgICAgIG1pbmlmeTogdHJ1ZSxcclxuICAgICAgdGFyZ2V0OiBgZXNuZXh0YCxcclxuICAgICAgc291cmNlTWFwOiB0cnVlLFxyXG4gICAgICBzb3VyY2VNYXBNb2RlOiBTb3VyY2VNYXBNb2RlLkVYVEVSTkFMLFxyXG4gICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgIC4uLnByb3BzLmVudnMsXHJcbiAgICAgIH0sXHJcbiAgICAgIC4uLihwcm9wcy5wcm9qZWN0Um9vdCAmJiB7IHByb2plY3RSb290OiBwcm9wcy5wcm9qZWN0Um9vdCB9KSxcclxuICAgICAgLi4uKHByb3BzLmRlcHNMb2NrRmlsZVBhdGggJiYge1xyXG4gICAgICAgIGRlcHNMb2NrRmlsZVBhdGg6IHByb3BzLmRlcHNMb2NrRmlsZVBhdGgsXHJcbiAgICAgIH0pLFxyXG4gICAgfSxcclxuICAgIHJvbGU6IHByb3BzLnJvbGUsXHJcbiAgICBsYXllcnM6IHVuZGVmaW5lZCxcclxuICB9O1xyXG5cclxuICByZXR1cm4gbGFtYmRhUHJvcDtcclxufTtcclxuXHJcbmNvbnN0IGFkZEludm9rZVBlcm1pc3Npb25Ub0xhbWJkYUZvckV2ZW50cyA9IChsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uKSA9PiB7XHJcbiAgbGFtYmRhLmFkZFBlcm1pc3Npb24oYEludm9rZVBlcm1pc3Npb24tJHtsYW1iZGEuZnVuY3Rpb25OYW1lfWAsIHtcclxuICAgIHByaW5jaXBhbDogbmV3IFNlcnZpY2VQcmluY2lwYWwoU0VSVklDRV9QUklOQ0lQQUwuRVZFTlRTKSxcclxuICB9KTtcclxufTtcclxuXHJcbmNvbnN0IGNyZWF0ZUV2ZW50UnVsZUZvckxhbWJkYSA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgb3B0aW9uczogQ3Jvbk9wdGlvbnNcclxuKSA9PiB7XHJcbiAgY29uc3QgZXZlbnRSdWxlID0gbmV3IFJ1bGUoXHJcbiAgICBzY29wZSxcclxuICAgIGBzY2hlZHVsZVJ1bGUtJHtsYW1iZGE/Lm5vZGUuaWQgfHwgXCIwMTBcIn1gLFxyXG4gICAge1xyXG4gICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3JvbihvcHRpb25zKSxcclxuICAgIH1cclxuICApO1xyXG5cclxuICByZXR1cm4gZXZlbnRSdWxlO1xyXG59O1xyXG5cclxuY29uc3QgZ3JhbnRBY2Nlc3NUb0R5bmFtb1RhYmxlcyA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgdGFibGVOYW1lcz86IHN0cmluZ1tdXHJcbikgPT4ge1xyXG4gIGlmICh0YWJsZU5hbWVzICYmIHRhYmxlTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgdGFibGVOYW1lcy5mb3JFYWNoKCh0YWJsZU5hbWUpID0+IHtcclxuICAgICAgY29uc3QgdGFibGUgPSBUYWJsZS5mcm9tVGFibGVOYW1lKHNjb3BlLCBgJHt0YWJsZU5hbWV9LXRhYmxlYCwgdGFibGVOYW1lKTtcclxuXHJcbiAgICAgIHRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgYWRkTGFtYmRhTGF5ZXJzID0gKFxyXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXHJcbiAgbGFtYmRhOiBOb2RlanNGdW5jdGlvbixcclxuICBsYXllckFybnM/OiBzdHJpbmdbXVxyXG4pID0+IHtcclxuICBpZiAobGF5ZXJBcm5zICYmIGxheWVyQXJucy5sZW5ndGggPiAwKSB7XHJcbiAgICBsYXllckFybnMuZm9yRWFjaCgoYXJuOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXHJcbiAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgYGNvbW1vbi1sYXllci0ke2lkeH1gLFxyXG4gICAgICAgIGFyblxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGFtYmRhLmFkZExheWVycyhsYXllcik7XHJcbiAgICB9KTtcclxuICB9XHJcbn07XHJcbiJdfQ==
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWJhc2ljLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvbGFtYmRhL2NyZWF0ZS1iYXNpYy1sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUF1RDtBQUN2RCx1REFBK0Q7QUFDL0QscUVBSXVDO0FBQ3ZDLG1EQUFxRDtBQUNyRCx5QkFBMEI7QUFDMUIsNkJBQThCO0FBRzlCLHFHQUFvRjtBQUNwRix1REFBcUU7QUFDckUsdUVBQWdFO0FBQ2hFLDJEQUFpRDtBQUVqRCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQVcsRUFBRTtJQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE9BQU8sUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxXQUFvQixFQUFzQixFQUFFO0lBQ3RFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxD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QyxLQUFnQixFQUNoQixNQUFzQixFQUN0QixVQUFxQixFQUNyQixFQUFFO0lBQ0YsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxLQUFLLEdBQUcsb0JBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEdBQUcsU0FBUyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFMUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQ3RCLEtBQWdCLEVBQ2hCLE1BQXNCLEVBQ3RCLFNBQW9CLEVBQ3BCLEVBQUU7SUFDRixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcseUJBQVksQ0FBQyxtQkFBbUIsQ0FDNUMsS0FBSyxFQUNMLGdCQUFnQixHQUFHLEVBQUUsRUFDckIsR0FBRyxDQUNKLENBQUM7WUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xyXG5pbXBvcnQgeyBMYXllclZlcnNpb24sIFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xyXG5pbXBvcnQge1xyXG4gIE5vZGVqc0Z1bmN0aW9uLFxyXG4gIE5vZGVqc0Z1bmN0aW9uUHJvcHMsXHJcbiAgU291cmNlTWFwTW9kZSxcclxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcclxuaW1wb3J0IHsgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xyXG5pbXBvcnQgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmltcG9ydCB7IFRpbWVySm9iUHJvcHMgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy90aW1lci1qb2JcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHsgU0VSVklDRV9QUklOQ0lQQUwgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2F3cy1zZXJ2aWNlLXByaW5jaXBhbC1jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgQ3Jvbk9wdGlvbnMsIFJ1bGUsIFNjaGVkdWxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcclxuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xyXG5cclxuY29uc3QgaXNTdWJQYXRoID0gKHJvb3Q6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKHJvb3QpLCBwYXRoLnJlc29sdmUodGFyZ2V0KSk7XHJcbiAgcmV0dXJuIHJlbGF0aXZlID09PSBcIlwiIHx8ICghcmVsYXRpdmUuc3RhcnRzV2l0aChcIi4uXCIpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmUpKTtcclxufTtcclxuXHJcbmNvbnN0IExPQ0tfRklMRV9OQU1FUyA9IFtcInBucG0tbG9jay55YW1sXCIsIFwieWFybi5sb2NrXCIsIFwicGFja2FnZS1sb2NrLmpzb25cIl07XHJcblxyXG5jb25zdCByZXNvbHZlUHJvamVjdFJvb3QgPSAocHJvamVjdFJvb3Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xyXG4gIGlmICghcHJvamVjdFJvb3QpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKHByb2plY3RSb290KVxyXG4gICAgPyBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QpXHJcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBwcm9qZWN0Um9vdCk7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kTmVhcmVzdExvY2tGaWxlID0gKHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xyXG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyKTtcclxuICBjb25zdCB7IHJvb3QgfSA9IHBhdGgucGFyc2UoY3VycmVudCk7XHJcblxyXG4gIHdoaWxlICh0cnVlKSB7XHJcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBMT0NLX0ZJTEVfTkFNRVMpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWRDYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudCwgY2FuZGlkYXRlKTtcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRDYW5kaWRhdGUpICYmIGZzLnN0YXRTeW5jKHJlc29sdmVkQ2FuZGlkYXRlKS5pc0ZpbGUoKSkge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlZENhbmRpZGF0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyZW50ID09PSByb290KSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQ29tbW9uQW5jZXN0b3IgPSAocGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcclxuICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbGV0IGFuY2VzdG9yID0gcGF0aC5yZXNvbHZlKHBhdGhzWzBdKTtcclxuXHJcbiAgZm9yIChjb25zdCBjdXJyZW50UGF0aCBvZiBwYXRocy5zbGljZSgxKSkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gcGF0aC5yZXNvbHZlKGN1cnJlbnRQYXRoKTtcclxuICAgIGNvbnN0IGFuY2VzdG9yUm9vdCA9IHBhdGgucGFyc2UoYW5jZXN0b3IpLnJvb3Q7XHJcblxyXG4gICAgaWYgKHBhdGgucGFyc2UoYW5jZXN0b3IpLnJvb3QudG9Mb3dlckNhc2UoKSAhPT0gcGF0aC5wYXJzZSh0YXJnZXQpLnJvb3QudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjYW5kaWRhdGUgPSBhbmNlc3RvcjtcclxuICAgIHdoaWxlICghaXNTdWJQYXRoKGNhbmRpZGF0ZSwgdGFyZ2V0KSkge1xyXG4gICAgICBpZiAoY2FuZGlkYXRlID09PSBhbmNlc3RvclJvb3QpIHtcclxuICAgICAgICBjYW5kaWRhdGUgPSBhbmNlc3RvclJvb3Q7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FuZGlkYXRlID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYW5jZXN0b3IgPSBjYW5kaWRhdGU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gYW5jZXN0b3I7XHJcbn07XHJcblxyXG5jb25zdCByZXNvbHZlUGF0aCA9IChpbnB1dFBhdGg6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoaW5wdXRQYXRoKSkge1xyXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShpbnB1dFBhdGgpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHByb2plY3RSb290KSB7XHJcbiAgICBjb25zdCBjYW5kaWRhdGVGcm9tUHJvamVjdFJvb3QgPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIGlucHV0UGF0aCk7XHJcbiAgICBpZiAoaXNTdWJQYXRoKHByb2plY3RSb290LCBjYW5kaWRhdGVGcm9tUHJvamVjdFJvb3QpKSB7XHJcbiAgICAgIHJldHVybiBjYW5kaWRhdGVGcm9tUHJvamVjdFJvb3Q7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGlucHV0UGF0aCk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzaWNMYW1iZGFUaW1lckpvYiA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIHByb3BzOiBUaW1lckpvYlByb3BzXHJcbik6IE5vZGVqc0Z1bmN0aW9uID0+IHtcclxuICBjb25zdCBsYW1iZGFQcm9wcyA9IGNyZWF0ZUJhc2ljTGFtYmRhUHJvcHMocHJvcHMpO1xyXG5cclxuICBsZXQgbGFtYmRhRnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24oXHJcbiAgICBzY29wZSxcclxuICAgIGAke3Byb3BzLmFwcFByZWZpeH0ke3Byb3BzLmZ1bmN0aW9uTmFtZX1gLFxyXG4gICAgbGFtYmRhUHJvcHNcclxuICApO1xyXG5cclxuICBhZGRJbnZva2VQZXJtaXNzaW9uVG9MYW1iZGFGb3JFdmVudHMobGFtYmRhRnVuY3Rpb24pO1xyXG5cclxuICBjb25zdCBldmVudFJ1bGUgPSBjcmVhdGVFdmVudFJ1bGVGb3JMYW1iZGEoXHJcbiAgICBzY29wZSxcclxuICAgIGxhbWJkYUZ1bmN0aW9uLFxyXG4gICAgcHJvcHMuY3Jvbk9wdGlvbnNcclxuICApO1xyXG5cclxuICBldmVudFJ1bGUuYWRkVGFyZ2V0KG5ldyBMYW1iZGFGdW5jdGlvbihsYW1iZGFGdW5jdGlvbikpO1xyXG5cclxuICBncmFudEFjY2Vzc1RvRHluYW1vVGFibGVzKHNjb3BlLCBsYW1iZGFGdW5jdGlvbiwgcHJvcHMuZHluYW1vVGFibGVOYW1lcyk7XHJcblxyXG4gIGFkZExhbWJkYUxheWVycyhzY29wZSwgbGFtYmRhRnVuY3Rpb24sIHByb3BzLmxhbWJkYUxheWVyQXJuKTtcclxuXHJcbiAgcmV0dXJuIGxhbWJkYUZ1bmN0aW9uO1xyXG59O1xyXG5cclxuY29uc3QgY3JlYXRlQmFzaWNMYW1iZGFQcm9wcyA9IChwcm9wczogVGltZXJKb2JQcm9wcyk6IE5vZGVqc0Z1bmN0aW9uUHJvcHMgPT4ge1xyXG4gIGNvbnN0IHJlc29sdmVkUHJvamVjdFJvb3QgPSByZXNvbHZlUHJvamVjdFJvb3QocHJvcHMucHJvamVjdFJvb3QpO1xyXG4gIGNvbnN0IGRlZmF1bHRSZWxhdGl2ZUVudHJ5ID0gcGF0aC5qb2luKFxyXG4gICAgXCJyZXNvdXJjZXNcIixcclxuICAgIFwibGFtYmRhc1wiLFxyXG4gICAgXCJ0aW1lci1qb2JzXCIsXHJcbiAgICBwcm9wcy5mdW5jdGlvbk5hbWUsXHJcbiAgICBcIm1haW4ubXRzXCJcclxuICApO1xyXG4gIGNvbnN0IGVudHJ5UGF0aCA9IHByb3BzLmNvZGVQYXRoID8/IGRlZmF1bHRSZWxhdGl2ZUVudHJ5O1xyXG4gIGNvbnN0IHJlc29sdmVkRW50cnkgPSByZXNvbHZlUGF0aChlbnRyeVBhdGgsIHJlc29sdmVkUHJvamVjdFJvb3QpO1xyXG5cclxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XHJcbiAgY29uc3QgZW50cnlEaXIgPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWRFbnRyeSk7XHJcblxyXG4gIGxldCBlZmZlY3RpdmVQcm9qZWN0Um9vdCA9IHJlc29sdmVkUHJvamVjdFJvb3QgPz8gY3dkO1xyXG4gIGlmICghaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZEVudHJ5KSkge1xyXG4gICAgY29uc3QgYW5jZXN0b3IgPSBmaW5kQ29tbW9uQW5jZXN0b3IoW2VmZmVjdGl2ZVByb2plY3RSb290LCBlbnRyeURpcl0pO1xyXG4gICAgaWYgKCFhbmNlc3Rvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYFVuYWJsZSB0byBkZXRlcm1pbmUgYSBwcm9qZWN0Um9vdCB0aGF0IGNvbnRhaW5zIGJvdGggJHtlZmZlY3RpdmVQcm9qZWN0Um9vdH0gYW5kICR7cmVzb2x2ZWRFbnRyeX0uYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgZWZmZWN0aXZlUHJvamVjdFJvb3QgPSBhbmNlc3RvcjtcclxuICB9XHJcblxyXG4gIGlmICghaXNTdWJQYXRoKGVmZmVjdGl2ZVByb2plY3RSb290LCByZXNvbHZlZEVudHJ5KSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICBgUmVzb2x2ZWQgbGFtYmRhIGVudHJ5ICR7cmVzb2x2ZWRFbnRyeX0gbXVzdCBiZSBsb2NhdGVkIHdpdGhpbiBwcm9qZWN0Um9vdCAke2VmZmVjdGl2ZVByb2plY3RSb290fS5gXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCA9IHByb3BzLmRlcHNMb2NrRmlsZVBhdGhcclxuICAgID8gcmVzb2x2ZVBhdGgocHJvcHMuZGVwc0xvY2tGaWxlUGF0aCwgcmVzb2x2ZWRQcm9qZWN0Um9vdClcclxuICAgIDogdW5kZWZpbmVkO1xyXG5cclxuICBpZiAoIXJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCkge1xyXG4gICAgY29uc3QgcG90ZW50aWFsTG9ja0ZpbGVzID0gW1xyXG4gICAgICBmaW5kTmVhcmVzdExvY2tGaWxlKGVudHJ5RGlyKSxcclxuICAgICAgZmluZE5lYXJlc3RMb2NrRmlsZShjd2QpLFxyXG4gICAgICBlZmZlY3RpdmVQcm9qZWN0Um9vdCAhPT0gY3dkID8gZmluZE5lYXJlc3RMb2NrRmlsZShlZmZlY3RpdmVQcm9qZWN0Um9vdCkgOiB1bmRlZmluZWQsXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAoY29uc3QgbG9ja0ZpbGUgb2YgcG90ZW50aWFsTG9ja0ZpbGVzKSB7XHJcbiAgICAgIGlmIChsb2NrRmlsZSAmJiBpc1N1YlBhdGgoZWZmZWN0aXZlUHJvamVjdFJvb3QsIGxvY2tGaWxlKSkge1xyXG4gICAgICAgIHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aCA9IGxvY2tGaWxlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICByZXNvbHZlZERlcHNMb2NrRmlsZVBhdGggJiZcclxuICAgICFpc1N1YlBhdGgoZWZmZWN0aXZlUHJvamVjdFJvb3QsIHJlc29sdmVkRGVwc0xvY2tGaWxlUGF0aClcclxuICApIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYFJlc29sdmVkIGRlcHNMb2NrRmlsZVBhdGggJHtyZXNvbHZlZERlcHNMb2NrRmlsZVBhdGh9IG11c3QgYmUgbG9jYXRlZCB3aXRoaW4gcHJvamVjdFJvb3QgJHtlZmZlY3RpdmVQcm9qZWN0Um9vdH0uYFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGVudmlyb25tZW50VmFycyA9IHByb3BzLmVudnMgPz8ge307XHJcblxyXG4gIGNvbnN0IGxhbWJkYVByb3A6IE5vZGVqc0Z1bmN0aW9uUHJvcHMgPSB7XHJcbiAgICBlbnRyeTogcmVzb2x2ZWRFbnRyeSxcclxuICAgIGZ1bmN0aW9uTmFtZTogYCR7cHJvcHMuYXBwUHJlZml4ID8gYCR7cHJvcHMuYXBwUHJlZml4fS1gIDogXCJcIn0ke1xyXG4gICAgICBwcm9wcy5mdW5jdGlvbk5hbWVcclxuICAgIH1gLFxyXG4gICAgaGFuZGxlcjogXCJtYWluLnRzXCIsXHJcbiAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxyXG4gICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfTEFURVNULFxyXG4gICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyhcclxuICAgICAgcHJvcHMudGltZW91dEluTWludXRlcyA/IHByb3BzLnRpbWVvdXRJbk1pbnV0ZXMgOiAxXHJcbiAgICApLFxyXG4gICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5LFxyXG4gICAgZW52aXJvbm1lbnQ6IHtcclxuICAgICAgLi4uZW52aXJvbm1lbnRWYXJzLFxyXG4gICAgfSxcclxuICAgIGJ1bmRsaW5nOiB7XHJcbiAgICAgIG1pbmlmeTogdHJ1ZSxcclxuICAgICAgdGFyZ2V0OiBgZXNuZXh0YCxcclxuICAgICAgc291cmNlTWFwOiB0cnVlLFxyXG4gICAgICBzb3VyY2VNYXBNb2RlOiBTb3VyY2VNYXBNb2RlLkVYVEVSTkFMLFxyXG4gICAgICBlbnZpcm9ubWVudDoge1xyXG4gICAgICAgIC4uLmVudmlyb25tZW50VmFycyxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICByb2xlOiBwcm9wcy5yb2xlLFxyXG4gICAgbGF5ZXJzOiB1bmRlZmluZWQsXHJcbiAgICAuLi4oZWZmZWN0aXZlUHJvamVjdFJvb3QgJiYgeyBwcm9qZWN0Um9vdDogZWZmZWN0aXZlUHJvamVjdFJvb3QgfSksXHJcbiAgICAuLi4ocmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRoICYmIHtcclxuICAgICAgZGVwc0xvY2tGaWxlUGF0aDogcmVzb2x2ZWREZXBzTG9ja0ZpbGVQYXRoLFxyXG4gICAgfSksXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIGxhbWJkYVByb3A7XHJcbn07XHJcblxyXG5jb25zdCBhZGRJbnZva2VQZXJtaXNzaW9uVG9MYW1iZGFGb3JFdmVudHMgPSAobGFtYmRhOiBOb2RlanNGdW5jdGlvbikgPT4ge1xyXG4gIGxhbWJkYS5hZGRQZXJtaXNzaW9uKGBJbnZva2VQZXJtaXNzaW9uLSR7bGFtYmRhLmZ1bmN0aW9uTmFtZX1gLCB7XHJcbiAgICBwcmluY2lwYWw6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFNFUlZJQ0VfUFJJTkNJUEFMLkVWRU5UUyksXHJcbiAgfSk7XHJcbn07XHJcblxyXG5jb25zdCBjcmVhdGVFdmVudFJ1bGVGb3JMYW1iZGEgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uLFxyXG4gIG9wdGlvbnM6IENyb25PcHRpb25zXHJcbikgPT4ge1xyXG4gIGNvbnN0IGV2ZW50UnVsZSA9IG5ldyBSdWxlKFxyXG4gICAgc2NvcGUsXHJcbiAgICBgc2NoZWR1bGVSdWxlLSR7bGFtYmRhPy5ub2RlLmlkIHx8IFwiMDEwXCJ9YCxcclxuICAgIHtcclxuICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24ob3B0aW9ucyksXHJcbiAgICB9XHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGV2ZW50UnVsZTtcclxufTtcclxuXHJcbmNvbnN0IGdyYW50QWNjZXNzVG9EeW5hbW9UYWJsZXMgPSAoXHJcbiAgc2NvcGU6IENvbnN0cnVjdCxcclxuICBsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uLFxyXG4gIHRhYmxlTmFtZXM/OiBzdHJpbmdbXVxyXG4pID0+IHtcclxuICBpZiAodGFibGVOYW1lcyAmJiB0YWJsZU5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgIHRhYmxlTmFtZXMuZm9yRWFjaCgodGFibGVOYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gVGFibGUuZnJvbVRhYmxlTmFtZShzY29wZSwgYCR7dGFibGVOYW1lfS10YWJsZWAsIHRhYmxlTmFtZSk7XHJcblxyXG4gICAgICB0YWJsZS5ncmFudFJlYWRXcml0ZURhdGEobGFtYmRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGFkZExhbWJkYUxheWVycyA9IChcclxuICBzY29wZTogQ29uc3RydWN0LFxyXG4gIGxhbWJkYTogTm9kZWpzRnVuY3Rpb24sXHJcbiAgbGF5ZXJBcm5zPzogc3RyaW5nW11cclxuKSA9PiB7XHJcbiAgaWYgKGxheWVyQXJucyAmJiBsYXllckFybnMubGVuZ3RoID4gMCkge1xyXG4gICAgbGF5ZXJBcm5zLmZvckVhY2goKGFybjogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBsYXllciA9IExheWVyVmVyc2lvbi5mcm9tTGF5ZXJWZXJzaW9uQXJuKFxyXG4gICAgICAgIHNjb3BlLFxyXG4gICAgICAgIGBjb21tb24tbGF5ZXItJHtpZHh9YCxcclxuICAgICAgICBhcm5cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGxhbWJkYS5hZGRMYXllcnMobGF5ZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59O1xyXG4iXX0=
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.26",
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,94 @@ 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
+ if (projectRoot) {
89
+ const candidateFromProjectRoot = path.resolve(projectRoot, inputPath);
90
+ if (isSubPath(projectRoot, candidateFromProjectRoot)) {
91
+ return candidateFromProjectRoot;
92
+ }
93
+ }
94
+
95
+ return path.resolve(process.cwd(), inputPath);
96
+ };
97
+
15
98
  export const createBasicLambda = (
16
99
  scope: Construct,
17
100
  props: LambdaProps
@@ -32,30 +115,66 @@ export const createBasicLambda = (
32
115
  };
33
116
 
34
117
  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`
118
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
119
+ const defaultRelativeEntry = path.join(
120
+ "resources",
121
+ "lambdas",
122
+ props.functionName,
123
+ "main.mts"
124
+ );
125
+ const entryPath = props.codePath ?? defaultRelativeEntry;
126
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
127
+
128
+ const cwd = path.resolve(process.cwd());
129
+ const entryDir = path.dirname(resolvedEntry);
130
+
131
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
132
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
133
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
134
+ if (!ancestor) {
135
+ throw new Error(
136
+ `Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`
137
+ );
138
+ }
139
+ effectiveProjectRoot = ancestor;
140
+ }
141
+
142
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
143
+ throw new Error(
144
+ `Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`
48
145
  );
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`
146
+ }
147
+
148
+ let resolvedDepsLockFilePath = props.depsLockFilePath
149
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
150
+ : undefined;
151
+
152
+ if (!resolvedDepsLockFilePath) {
153
+ const potentialLockFiles = [
154
+ findNearestLockFile(entryDir),
155
+ findNearestLockFile(cwd),
156
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
157
+ ];
158
+
159
+ for (const lockFile of potentialLockFiles) {
160
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
161
+ resolvedDepsLockFilePath = lockFile;
162
+ break;
163
+ }
164
+ }
165
+ }
166
+
167
+ if (
168
+ resolvedDepsLockFilePath &&
169
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)
170
+ ) {
171
+ throw new Error(
172
+ `Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`
56
173
  );
57
174
  }
58
175
 
176
+ const environmentVars = props.envs ?? {};
177
+
59
178
  const lambdaProp: NodejsFunctionProps = {
60
179
  entry: resolvedEntry,
61
180
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
@@ -69,7 +188,7 @@ const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
69
188
  ),
70
189
  memorySize: props.memory,
71
190
  environment: {
72
- ...props.envs,
191
+ ...environmentVars,
73
192
  },
74
193
  bundling: {
75
194
  minify: true,
@@ -77,15 +196,15 @@ const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
77
196
  sourceMap: true,
78
197
  sourceMapMode: SourceMapMode.EXTERNAL,
79
198
  environment: {
80
- ...props.envs,
199
+ ...environmentVars,
81
200
  },
82
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
83
- ...(props.depsLockFilePath && {
84
- depsLockFilePath: props.depsLockFilePath,
85
- }),
86
201
  },
87
202
  role: props.role,
88
203
  layers: undefined,
204
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
205
+ ...(resolvedDepsLockFilePath && {
206
+ depsLockFilePath: resolvedDepsLockFilePath,
207
+ }),
89
208
  };
90
209
 
91
210
  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,88 @@ 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
+ if (projectRoot) {
92
+ const candidateFromProjectRoot = path.resolve(projectRoot, inputPath);
93
+ if (isSubPath(projectRoot, candidateFromProjectRoot)) {
94
+ return candidateFromProjectRoot;
95
+ }
96
+ }
97
+
98
+ return path.resolve(process.cwd(), inputPath);
99
+ };
100
+
18
101
  export const createBasicLambdaTimerJob = (
19
102
  scope: Construct,
20
103
  props: TimerJobProps
@@ -45,30 +128,67 @@ export const createBasicLambdaTimerJob = (
45
128
  };
46
129
 
47
130
  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`
131
+ const resolvedProjectRoot = resolveProjectRoot(props.projectRoot);
132
+ const defaultRelativeEntry = path.join(
133
+ "resources",
134
+ "lambdas",
135
+ "timer-jobs",
136
+ props.functionName,
137
+ "main.mts"
138
+ );
139
+ const entryPath = props.codePath ?? defaultRelativeEntry;
140
+ const resolvedEntry = resolvePath(entryPath, resolvedProjectRoot);
141
+
142
+ const cwd = path.resolve(process.cwd());
143
+ const entryDir = path.dirname(resolvedEntry);
144
+
145
+ let effectiveProjectRoot = resolvedProjectRoot ?? cwd;
146
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
147
+ const ancestor = findCommonAncestor([effectiveProjectRoot, entryDir]);
148
+ if (!ancestor) {
149
+ throw new Error(
150
+ `Unable to determine a projectRoot that contains both ${effectiveProjectRoot} and ${resolvedEntry}.`
151
+ );
152
+ }
153
+ effectiveProjectRoot = ancestor;
154
+ }
155
+
156
+ if (!isSubPath(effectiveProjectRoot, resolvedEntry)) {
157
+ throw new Error(
158
+ `Resolved lambda entry ${resolvedEntry} must be located within projectRoot ${effectiveProjectRoot}.`
61
159
  );
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`
160
+ }
161
+
162
+ let resolvedDepsLockFilePath = props.depsLockFilePath
163
+ ? resolvePath(props.depsLockFilePath, resolvedProjectRoot)
164
+ : undefined;
165
+
166
+ if (!resolvedDepsLockFilePath) {
167
+ const potentialLockFiles = [
168
+ findNearestLockFile(entryDir),
169
+ findNearestLockFile(cwd),
170
+ effectiveProjectRoot !== cwd ? findNearestLockFile(effectiveProjectRoot) : undefined,
171
+ ];
172
+
173
+ for (const lockFile of potentialLockFiles) {
174
+ if (lockFile && isSubPath(effectiveProjectRoot, lockFile)) {
175
+ resolvedDepsLockFilePath = lockFile;
176
+ break;
177
+ }
178
+ }
179
+ }
180
+
181
+ if (
182
+ resolvedDepsLockFilePath &&
183
+ !isSubPath(effectiveProjectRoot, resolvedDepsLockFilePath)
184
+ ) {
185
+ throw new Error(
186
+ `Resolved depsLockFilePath ${resolvedDepsLockFilePath} must be located within projectRoot ${effectiveProjectRoot}.`
69
187
  );
70
188
  }
71
189
 
190
+ const environmentVars = props.envs ?? {};
191
+
72
192
  const lambdaProp: NodejsFunctionProps = {
73
193
  entry: resolvedEntry,
74
194
  functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
@@ -82,7 +202,7 @@ const createBasicLambdaProps = (props: TimerJobProps): NodejsFunctionProps => {
82
202
  ),
83
203
  memorySize: props.memory,
84
204
  environment: {
85
- ...props.envs,
205
+ ...environmentVars,
86
206
  },
87
207
  bundling: {
88
208
  minify: true,
@@ -90,15 +210,15 @@ const createBasicLambdaProps = (props: TimerJobProps): NodejsFunctionProps => {
90
210
  sourceMap: true,
91
211
  sourceMapMode: SourceMapMode.EXTERNAL,
92
212
  environment: {
93
- ...props.envs,
213
+ ...environmentVars,
94
214
  },
95
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
96
- ...(props.depsLockFilePath && {
97
- depsLockFilePath: props.depsLockFilePath,
98
- }),
99
215
  },
100
216
  role: props.role,
101
217
  layers: undefined,
218
+ ...(effectiveProjectRoot && { projectRoot: effectiveProjectRoot }),
219
+ ...(resolvedDepsLockFilePath && {
220
+ depsLockFilePath: resolvedDepsLockFilePath,
221
+ }),
102
222
  };
103
223
 
104
224
  return lambdaProp;