cdk-cost-analyzer 0.1.20 → 0.1.22

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.
@@ -2,35 +2,35 @@
2
2
  "entries": {
3
3
  "AmazonS3:US East (N. Virginia):storageClass:General Purpose|volumeType:Standard": {
4
4
  "price": 0.023,
5
- "timestamp": 1770316389184
5
+ "timestamp": 1770321836931
6
6
  },
7
7
  "AmazonDynamoDB:US East (N. Virginia):group:DDB-ReadUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
8
8
  "price": 0.023,
9
- "timestamp": 1770316389192
9
+ "timestamp": 1770321836939
10
10
  },
11
11
  "AmazonDynamoDB:US East (N. Virginia):group:DDB-WriteUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
12
12
  "price": 0.023,
13
- "timestamp": 1770316389192
13
+ "timestamp": 1770321836939
14
14
  },
15
15
  "AmazonEC2:US East (N. Virginia):capacitystatus:Used|instanceType:t3.micro|operatingSystem:Linux|preInstalledSw:NA|tenancy:Shared": {
16
16
  "price": 0.023,
17
- "timestamp": 1770316389201
17
+ "timestamp": 1770321836953
18
18
  },
19
19
  "AWSLambda:US East (N. Virginia):group:AWS-Lambda-Requests": {
20
20
  "price": 0.023,
21
- "timestamp": 1770316389206
21
+ "timestamp": 1770321836958
22
22
  },
23
23
  "AWSLambda:US East (N. Virginia):group:AWS-Lambda-Duration": {
24
24
  "price": 0.023,
25
- "timestamp": 1770316389206
25
+ "timestamp": 1770321836958
26
26
  },
27
27
  "AmazonS3:EU (Frankfurt):storageClass:General Purpose|volumeType:Standard": {
28
28
  "price": 0.023,
29
- "timestamp": 1770316398521
29
+ "timestamp": 1770321846317
30
30
  },
31
31
  "AmazonS3:invalid-region-123:storageClass:General Purpose|volumeType:Standard": {
32
32
  "price": 0.023,
33
- "timestamp": 1770316398554
33
+ "timestamp": 1770321846357
34
34
  }
35
35
  }
36
36
  }
@@ -63,7 +63,7 @@ class SingleTemplateAnalyzer {
63
63
  // Calculate costs for all resources
64
64
  const analyzedAt = new Date();
65
65
  const resourceCosts = await Promise.all(resources.map(async (resource) => {
66
- const monthlyCost = await pricingService.getResourceCost(resource, region);
66
+ const monthlyCost = await pricingService.getResourceCost(resource, region, resources);
67
67
  return {
68
68
  logicalId: resource.logicalId,
69
69
  type: resource.type,
@@ -165,4 +165,4 @@ class SingleTemplateAnalyzer {
165
165
  }
166
166
  }
167
167
  exports.SingleTemplateAnalyzer = SingleTemplateAnalyzer;
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVBbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbmFseXNpcy9TaW5nbGVUZW1wbGF0ZUFuYWx5emVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw2REFBMEQ7QUFDMUQsOERBQTJEO0FBWTNEOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakM7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQ2hCLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxNQUF1QjtRQUV2QixNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLENBQ3ZDLE1BQU0sRUFDTixNQUFNLEVBQUUsZ0JBQWdCLEVBQ3hCLE1BQU0sRUFBRSxxQkFBcUIsRUFDN0IsTUFBTSxFQUFFLFdBQVcsQ0FDcEIsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILHFCQUFxQjtZQUNyQixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sU0FBUyxHQUFxQixNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUNwRixDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekMsU0FBUztnQkFDVCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7YUFDdEMsQ0FBQyxDQUNILENBQUM7WUFFRixvQ0FBb0M7WUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBMkIsTUFBTSxPQUFPLENBQUMs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SyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUvQyxPQUFPO1lBQ0wsY0FBYztZQUNkLGlCQUFpQjtZQUNqQixXQUFXO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUN0QixRQUFnQixFQUNoQixNQUFjLEVBQ2QsYUFBcUMsRUFDckMsVUFBZ0I7UUFFaEIsNEJBQTRCO1FBQzVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpHLDJDQUEyQztRQUMzQyxNQUFNLHNCQUFzQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ2pELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUM3RSxDQUFDLE1BQU0sQ0FBQztRQUNULE1BQU0sd0JBQXdCLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQztRQUUvRSxPQUFPO1lBQ0wsWUFBWTtZQUNaLE1BQU07WUFDTixVQUFVO1lBQ1YsYUFBYSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1lBQ25DLHNCQUFzQjtZQUN0Qix3QkFBd0I7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5LRCx3REFtS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSAnLi4vcGFyc2VyL1RlbXBsYXRlUGFyc2VyJztcbmltcG9ydCB7IFByaWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcHJpY2luZy9QcmljaW5nU2VydmljZSc7XG5pbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHtcbiAgQW5hbHlzaXNDb25maWcsXG4gIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgQ29zdEJyZWFrZG93bixcbiAgUmVzb3VyY2VUeXBlQ29zdCxcbiAgQ29uZmlkZW5jZUxldmVsQ29zdCxcbiAgRW5oYW5jZWRSZXNvdXJjZUNvc3QsXG4gIEFuYWx5c2lzTWV0YWRhdGEsXG59IGZyb20gJy4uL2FwaS9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGFuYWx5emluZyBjb3N0cyBpbiBhIHNpbmdsZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlVGVtcGxhdGVBbmFseXplciB7XG4gIC8qKlxuICAgKiBBbmFseXplIGNvc3RzIGZvciBhbGwgcmVzb3VyY2VzIGluIGEgc2luZ2xlIHRlbXBsYXRlXG4gICAqIFxuICAgKiBAcGFyYW0gdGVtcGxhdGUgLSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSBjb250ZW50IChKU09OIG9yIFlBTUwpXG4gICAqIEBwYXJhbSByZWdpb24gLSBBV1MgcmVnaW9uIGZvciBwcmljaW5nIGNhbGN1bGF0aW9uc1xuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgYW5hbHlzaXNcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZGV0YWlsZWQgY29zdCBhbmFseXNpcyByZXN1bHRcbiAgICovXG4gIGFzeW5jIGFuYWx5emVDb3N0cyhcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IEFuYWx5c2lzQ29uZmlnLFxuICApOiBQcm9taXNlPFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdD4ge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBUZW1wbGF0ZVBhcnNlcigpO1xuICAgIGNvbnN0IHByaWNpbmdTZXJ2aWNlID0gbmV3IFByaWNpbmdTZXJ2aWNlKFxuICAgICAgcmVnaW9uLFxuICAgICAgY29uZmlnPy51c2FnZUFzc3VtcHRpb25zLFxuICAgICAgY29uZmlnPy5leGNsdWRlZFJlc291cmNlVHlwZXMsXG4gICAgICBjb25maWc/LmNhY2hlQ29uZmlnLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCBwYXJzZWRUZW1wbGF0ZSA9IHBhcnNlci5wYXJzZSh0ZW1wbGF0ZSk7XG4gICAgICBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10gPSBPYmplY3QuZW50cmllcyhwYXJzZWRUZW1wbGF0ZS5SZXNvdXJjZXMgfHwge30pLm1hcChcbiAgICAgICAgKFtsb2dpY2FsSWQsIHJlc291cmNlXTogW3N0cmluZywgYW55XSkgPT4gKHtcbiAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UuVHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5Qcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjb3N0cyBmb3IgYWxsIHJlc291cmNlc1xuICAgICAgY29uc3QgYW5hbHl6ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCByZXNvdXJjZUNvc3RzOiBFbmhhbmNlZFJlc291cmNlQ29zdFtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlc291cmNlcy5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbW9udGhseUNvc3QgPSBhd2FpdCBwcmljaW5nU2VydmljZS5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbik7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICAgICAgcHJvcGVydGllczogcmVzb3VyY2UucHJvcGVydGllcyxcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgIGNhbGN1bGF0ZWRBdDogYW5hbHl6ZWRBdCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBjb3N0XG4gICAgICBjb25zdCB0b3RhbE1vbnRobHlDb3N0ID0gcmVzb3VyY2VDb3N0cy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIHJjKSA9PiBzdW0gKyByYy5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgICAgIDAsXG4gICAgICApO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBjb3N0IGJyZWFrZG93blxuICAgICAgY29uc3QgY29zdEJyZWFrZG93biA9IHRoaXMuZ2VuZXJhdGVDb3N0QnJlYWtkb3duKHJlc291cmNlQ29zdHMpO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmdlbmVyYXRlTWV0YWRhdGEodGVtcGxhdGUsIHJlZ2lvbiwgcmVzb3VyY2VDb3N0cywgYW5hbHl6ZWRBdCk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHN1bW1hcnkgKHBsYWNlaG9sZGVyIC0gd2lsbCBiZSByZXBsYWNlZCBieSByZXBvcnRlcilcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBgVG90YWwgbW9udGhseSBjb3N0OiAkJHt0b3RhbE1vbnRobHlDb3N0LnRvRml4ZWQoMil9IFVTRGA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsTW9udGhseUNvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgcmVzb3VyY2VDb3N0cyxcbiAgICAgICAgY29zdEJyZWFrZG93bixcbiAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhbiB1cCBwcmljaW5nIHNlcnZpY2UgcmVzb3VyY2VzXG4gICAgICBwcmljaW5nU2VydmljZS5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGNvc3QgYnJlYWtkb3duIGdyb3VwZWQgYnkgcmVzb3VyY2UgdHlwZSBhbmQgY29uZmlkZW5jZSBsZXZlbFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvc3RCcmVha2Rvd24ocmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXSk6IENvc3RCcmVha2Rvd24ge1xuICAgIC8vIEdyb3VwIGJ5IHJlc291cmNlIHR5cGVcbiAgICBjb25zdCBieVR5cGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRW5oYW5jZWRSZXNvdXJjZUNvc3RbXT4oKTtcbiAgICBmb3IgKGNvbnN0IHJjIG9mIHJlc291cmNlQ29zdHMpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYnlUeXBlTWFwLmdldChyYy50eXBlKSB8fCBbXTtcbiAgICAgIGV4aXN0aW5nLnB1c2gocmMpO1xuICAgICAgYnlUeXBlTWFwLnNldChyYy50eXBlLCBleGlzdGluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnlSZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZUNvc3RbXSA9IEFycmF5LmZyb20oYnlUeXBlTWFwLmVudHJpZXMoKSlcbiAgICAgIC5tYXAoKFtyZXNvdXJjZVR5cGUsIHJlc291cmNlc10pID0+ICh7XG4gICAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgICAgY291bnQ6IHJlc291cmNlcy5sZW5ndGgsXG4gICAgICAgIHRvdGFsQ29zdDogcmVzb3VyY2VzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCksXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLm1hcCgocikgPT4gKHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHIubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHIudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdDogci5tb250aGx5Q29zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSkpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7IC8vIFNvcnQgYnkgY29zdCBkZXNjZW5kaW5nXG5cbiAgICAvLyBHcm91cCBieSBjb25maWRlbmNlIGxldmVsXG4gICAgY29uc3QgYnlDb25maWRlbmNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEVuaGFuY2VkUmVzb3VyY2VDb3N0W10+KCk7XG4gICAgZm9yIChjb25zdCByYyBvZiByZXNvdXJjZUNvc3RzKSB7XG4gICAgICBjb25zdCBjb25maWRlbmNlID0gcmMubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYnlDb25maWRlbmNlTWFwLmdldChjb25maWRlbmNlKSB8fCBbXTtcbiAgICAgIGV4aXN0aW5nLnB1c2gocmMpO1xuICAgICAgYnlDb25maWRlbmNlTWFwLnNldChjb25maWRlbmNlLCBleGlzdGluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnlDb25maWRlbmNlTGV2ZWw6IENvbmZpZGVuY2VMZXZlbENvc3RbXSA9IEFycmF5LmZyb20oYnlDb25maWRlbmNlTWFwLmVudHJpZXMoKSkubWFwKFxuICAgICAgKFtjb25maWRlbmNlLCByZXNvdXJjZXNdKSA9PiAoe1xuICAgICAgICBjb25maWRlbmNlOiBjb25maWRlbmNlIGFzICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCAndW5rbm93bicsXG4gICAgICAgIGNvdW50OiByZXNvdXJjZXMubGVuZ3RoLFxuICAgICAgICB0b3RhbENvc3Q6IHJlc291cmNlcy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENvbGxlY3QgYWxsIHVuaXF1ZSBhc3N1bXB0aW9uc1xuICAgIGNvbnN0IGFzc3VtcHRpb25zU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByYyBvZiByZXNvdXJjZUNvc3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmMubW9udGhseUNvc3QuYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgYXNzdW1wdGlvbnNTZXQuYWRkKGFzc3VtcHRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IEFycmF5LmZyb20oYXNzdW1wdGlvbnNTZXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ5UmVzb3VyY2VUeXBlLFxuICAgICAgYnlDb25maWRlbmNlTGV2ZWwsXG4gICAgICBhc3N1bXB0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIG1ldGFkYXRhIGFib3V0IHRoZSBhbmFseXNpc1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1ldGFkYXRhKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXSxcbiAgICBhbmFseXplZEF0OiBEYXRlLFxuICApOiBBbmFseXNpc01ldGFkYXRhIHtcbiAgICAvLyBHZW5lcmF0ZSBoYXNoIG9mIHRlbXBsYXRlXG4gICAgY29uc3QgdGVtcGxhdGVIYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh0ZW1wbGF0ZSkuZGlnZXN0KCdoZXgnKS5zdWJzdHJpbmcoMCwgMTYpO1xuXG4gICAgLy8gQ291bnQgc3VwcG9ydGVkIHZzIHVuc3VwcG9ydGVkIHJlc291cmNlc1xuICAgIGNvbnN0IHN1cHBvcnRlZFJlc291cmNlQ291bnQgPSByZXNvdXJjZUNvc3RzLmZpbHRlcihcbiAgICAgIChyYykgPT4gcmMubW9udGhseUNvc3QuY29uZmlkZW5jZSAhPT0gJ3Vua25vd24nIHx8IHJjLm1vbnRobHlDb3N0LmFtb3VudCA+IDAsXG4gICAgKS5sZW5ndGg7XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRSZXNvdXJjZUNvdW50ID0gcmVzb3VyY2VDb3N0cy5sZW5ndGggLSBzdXBwb3J0ZWRSZXNvdXJjZUNvdW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbXBsYXRlSGFzaCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFuYWx5emVkQXQsXG4gICAgICByZXNvdXJjZUNvdW50OiByZXNvdXJjZUNvc3RzLmxlbmd0aCxcbiAgICAgIHN1cHBvcnRlZFJlc291cmNlQ291bnQsXG4gICAgICB1bnN1cHBvcnRlZFJlc291cmNlQ291bnQsXG4gICAgfTtcbiAgfVxufVxuIl19
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVBbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbmFseXNpcy9TaW5nbGVUZW1wbGF0ZUFuYWx5emVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw2REFBMEQ7QUFDMUQsOERBQTJEO0FBWTNEOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDakM7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQ2hCLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxNQUF1QjtRQUV2QixNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLENBQ3ZDLE1BQU0sRUFDTixNQUFNLEVBQUUsZ0JBQWdCLEVBQ3hCLE1BQU0sRUFBRSxxQkFBcUIsRUFDN0IsTUFBTSxFQUFFLFdBQVcsQ0FDcEIsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILHFCQUFxQjtZQUNyQixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sU0FBUyxHQUFxQixNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUNwRixDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekMsU0FBUztnQkFDVCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7YUFDdEMsQ0FBQyxDQUNILENBQUM7WUFFRixvQ0FBb0M7WUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLGFBQWEsR0FBMkIsTUFBTSxPQUFPLENBQUMs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VyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0MsT0FBTztZQUNMLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsV0FBVztTQUNaLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FDdEIsUUFBZ0IsRUFDaEIsTUFBYyxFQUNkLGFBQXFDLEVBQ3JDLFVBQWdCO1FBRWhCLDRCQUE0QjtRQUM1QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqRywyQ0FBMkM7UUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUNqRCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDN0UsQ0FBQyxNQUFNLENBQUM7UUFDVCxNQUFNLHdCQUF3QixHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsc0JBQXNCLENBQUM7UUFFL0UsT0FBTztZQUNMLFlBQVk7WUFDWixNQUFNO1lBQ04sVUFBVTtZQUNWLGFBQWEsRUFBRSxhQUFhLENBQUMsTUFBTTtZQUNuQyxzQkFBc0I7WUFDdEIsd0JBQXdCO1NBQ3pCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuS0Qsd0RBbUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnNlciB9IGZyb20gJy4uL3BhcnNlci9UZW1wbGF0ZVBhcnNlcic7XG5pbXBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4uL3ByaWNpbmcvUHJpY2luZ1NlcnZpY2UnO1xuaW1wb3J0IHsgUmVzb3VyY2VXaXRoSWQgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7XG4gIEFuYWx5c2lzQ29uZmlnLFxuICBTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQsXG4gIENvc3RCcmVha2Rvd24sXG4gIFJlc291cmNlVHlwZUNvc3QsXG4gIENvbmZpZGVuY2VMZXZlbENvc3QsXG4gIEVuaGFuY2VkUmVzb3VyY2VDb3N0LFxuICBBbmFseXNpc01ldGFkYXRhLFxufSBmcm9tICcuLi9hcGkvc2luZ2xlLXRlbXBsYXRlLXR5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBhbmFseXppbmcgY29zdHMgaW4gYSBzaW5nbGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZVRlbXBsYXRlQW5hbHl6ZXIge1xuICAvKipcbiAgICogQW5hbHl6ZSBjb3N0cyBmb3IgYWxsIHJlc291cmNlcyBpbiBhIHNpbmdsZSB0ZW1wbGF0ZVxuICAgKiBcbiAgICogQHBhcmFtIHRlbXBsYXRlIC0gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgY29udGVudCAoSlNPTiBvciBZQU1MKVxuICAgKiBAcGFyYW0gcmVnaW9uIC0gQVdTIHJlZ2lvbiBmb3IgcHJpY2luZyBjYWxjdWxhdGlvbnNcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGFuYWx5c2lzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRldGFpbGVkIGNvc3QgYW5hbHlzaXMgcmVzdWx0XG4gICAqL1xuICBhc3luYyBhbmFseXplQ29zdHMoXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBjb25maWc/OiBBbmFseXNpc0NvbmZpZyxcbiAgKTogUHJvbWlzZTxTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQ+IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIoKTtcbiAgICBjb25zdCBwcmljaW5nU2VydmljZSA9IG5ldyBQcmljaW5nU2VydmljZShcbiAgICAgIHJlZ2lvbixcbiAgICAgIGNvbmZpZz8udXNhZ2VBc3N1bXB0aW9ucyxcbiAgICAgIGNvbmZpZz8uZXhjbHVkZWRSZXNvdXJjZVR5cGVzLFxuICAgICAgY29uZmlnPy5jYWNoZUNvbmZpZyxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFBhcnNlIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgcGFyc2VkVGVtcGxhdGUgPSBwYXJzZXIucGFyc2UodGVtcGxhdGUpO1xuICAgICAgY29uc3QgcmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gT2JqZWN0LmVudHJpZXMocGFyc2VkVGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9KS5tYXAoXG4gICAgICAgIChbbG9naWNhbElkLCByZXNvdXJjZV06IFtzdHJpbmcsIGFueV0pID0+ICh7XG4gICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLlR5cGUsXG4gICAgICAgICAgcHJvcGVydGllczogcmVzb3VyY2UuUHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgY29zdHMgZm9yIGFsbCByZXNvdXJjZXNcbiAgICAgIGNvbnN0IGFuYWx5emVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgcmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByZXNvdXJjZXMubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgcHJpY2luZ1NlcnZpY2UuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIHJlc291cmNlcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICAgICAgcHJvcGVydGllczogcmVzb3VyY2UucHJvcGVydGllcyxcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgIGNhbGN1bGF0ZWRBdDogYW5hbHl6ZWRBdCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBjb3N0XG4gICAgICBjb25zdCB0b3RhbE1vbnRobHlDb3N0ID0gcmVzb3VyY2VDb3N0cy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIHJjKSA9PiBzdW0gKyByYy5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgICAgIDAsXG4gICAgICApO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBjb3N0IGJyZWFrZG93blxuICAgICAgY29uc3QgY29zdEJyZWFrZG93biA9IHRoaXMuZ2VuZXJhdGVDb3N0QnJlYWtkb3duKHJlc291cmNlQ29zdHMpO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmdlbmVyYXRlTWV0YWRhdGEodGVtcGxhdGUsIHJlZ2lvbiwgcmVzb3VyY2VDb3N0cywgYW5hbHl6ZWRBdCk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHN1bW1hcnkgKHBsYWNlaG9sZGVyIC0gd2lsbCBiZSByZXBsYWNlZCBieSByZXBvcnRlcilcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBgVG90YWwgbW9udGhseSBjb3N0OiAkJHt0b3RhbE1vbnRobHlDb3N0LnRvRml4ZWQoMil9IFVTRGA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsTW9udGhseUNvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgcmVzb3VyY2VDb3N0cyxcbiAgICAgICAgY29zdEJyZWFrZG93bixcbiAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhbiB1cCBwcmljaW5nIHNlcnZpY2UgcmVzb3VyY2VzXG4gICAgICBwcmljaW5nU2VydmljZS5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGNvc3QgYnJlYWtkb3duIGdyb3VwZWQgYnkgcmVzb3VyY2UgdHlwZSBhbmQgY29uZmlkZW5jZSBsZXZlbFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvc3RCcmVha2Rvd24ocmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXSk6IENvc3RCcmVha2Rvd24ge1xuICAgIC8vIEdyb3VwIGJ5IHJlc291cmNlIHR5cGVcbiAgICBjb25zdCBieVR5cGVNYXAgPSBuZXcgTWFwPHN0cmluZywgRW5oYW5jZWRSZXNvdXJjZUNvc3RbXT4oKTtcbiAgICBmb3IgKGNvbnN0IHJjIG9mIHJlc291cmNlQ29zdHMpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYnlUeXBlTWFwLmdldChyYy50eXBlKSB8fCBbXTtcbiAgICAgIGV4aXN0aW5nLnB1c2gocmMpO1xuICAgICAgYnlUeXBlTWFwLnNldChyYy50eXBlLCBleGlzdGluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnlSZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZUNvc3RbXSA9IEFycmF5LmZyb20oYnlUeXBlTWFwLmVudHJpZXMoKSlcbiAgICAgIC5tYXAoKFtyZXNvdXJjZVR5cGUsIHJlc291cmNlc10pID0+ICh7XG4gICAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgICAgY291bnQ6IHJlc291cmNlcy5sZW5ndGgsXG4gICAgICAgIHRvdGFsQ29zdDogcmVzb3VyY2VzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCksXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLm1hcCgocikgPT4gKHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHIubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHIudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdDogci5tb250aGx5Q29zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSkpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7IC8vIFNvcnQgYnkgY29zdCBkZXNjZW5kaW5nXG5cbiAgICAvLyBHcm91cCBieSBjb25maWRlbmNlIGxldmVsXG4gICAgY29uc3QgYnlDb25maWRlbmNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEVuaGFuY2VkUmVzb3VyY2VDb3N0W10+KCk7XG4gICAgZm9yIChjb25zdCByYyBvZiByZXNvdXJjZUNvc3RzKSB7XG4gICAgICBjb25zdCBjb25maWRlbmNlID0gcmMubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYnlDb25maWRlbmNlTWFwLmdldChjb25maWRlbmNlKSB8fCBbXTtcbiAgICAgIGV4aXN0aW5nLnB1c2gocmMpO1xuICAgICAgYnlDb25maWRlbmNlTWFwLnNldChjb25maWRlbmNlLCBleGlzdGluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgYnlDb25maWRlbmNlTGV2ZWw6IENvbmZpZGVuY2VMZXZlbENvc3RbXSA9IEFycmF5LmZyb20oYnlDb25maWRlbmNlTWFwLmVudHJpZXMoKSkubWFwKFxuICAgICAgKFtjb25maWRlbmNlLCByZXNvdXJjZXNdKSA9PiAoe1xuICAgICAgICBjb25maWRlbmNlOiBjb25maWRlbmNlIGFzICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCAndW5rbm93bicsXG4gICAgICAgIGNvdW50OiByZXNvdXJjZXMubGVuZ3RoLFxuICAgICAgICB0b3RhbENvc3Q6IHJlc291cmNlcy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENvbGxlY3QgYWxsIHVuaXF1ZSBhc3N1bXB0aW9uc1xuICAgIGNvbnN0IGFzc3VtcHRpb25zU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByYyBvZiByZXNvdXJjZUNvc3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmMubW9udGhseUNvc3QuYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgYXNzdW1wdGlvbnNTZXQuYWRkKGFzc3VtcHRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IEFycmF5LmZyb20oYXNzdW1wdGlvbnNTZXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ5UmVzb3VyY2VUeXBlLFxuICAgICAgYnlDb25maWRlbmNlTGV2ZWwsXG4gICAgICBhc3N1bXB0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIG1ldGFkYXRhIGFib3V0IHRoZSBhbmFseXNpc1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1ldGFkYXRhKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXSxcbiAgICBhbmFseXplZEF0OiBEYXRlLFxuICApOiBBbmFseXNpc01ldGFkYXRhIHtcbiAgICAvLyBHZW5lcmF0ZSBoYXNoIG9mIHRlbXBsYXRlXG4gICAgY29uc3QgdGVtcGxhdGVIYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh0ZW1wbGF0ZSkuZGlnZXN0KCdoZXgnKS5zdWJzdHJpbmcoMCwgMTYpO1xuXG4gICAgLy8gQ291bnQgc3VwcG9ydGVkIHZzIHVuc3VwcG9ydGVkIHJlc291cmNlc1xuICAgIGNvbnN0IHN1cHBvcnRlZFJlc291cmNlQ291bnQgPSByZXNvdXJjZUNvc3RzLmZpbHRlcihcbiAgICAgIChyYykgPT4gcmMubW9udGhseUNvc3QuY29uZmlkZW5jZSAhPT0gJ3Vua25vd24nIHx8IHJjLm1vbnRobHlDb3N0LmFtb3VudCA+IDAsXG4gICAgKS5sZW5ndGg7XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRSZXNvdXJjZUNvdW50ID0gcmVzb3VyY2VDb3N0cy5sZW5ndGggLSBzdXBwb3J0ZWRSZXNvdXJjZUNvdW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbXBsYXRlSGFzaCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFuYWx5emVkQXQsXG4gICAgICByZXNvdXJjZUNvdW50OiByZXNvdXJjZUNvc3RzLmxlbmd0aCxcbiAgICAgIHN1cHBvcnRlZFJlc291cmNlQ291bnQsXG4gICAgICB1bnN1cHBvcnRlZFJlc291cmNlQ291bnQsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -7,7 +7,7 @@ export declare class PricingService implements IPricingService {
7
7
  private pricingClient;
8
8
  private excludedResourceTypes;
9
9
  constructor(region?: string, usageAssumptions?: UsageAssumptionsConfig, excludedResourceTypes?: string[], cacheConfig?: CacheConfig, pricingClient?: PricingClient);
10
- getResourceCost(resource: ResourceWithId, region: string): Promise<MonthlyCost>;
10
+ getResourceCost(resource: ResourceWithId, region: string, templateResources?: ResourceWithId[]): Promise<MonthlyCost>;
11
11
  getCostDelta(diff: ResourceDiff, region: string): Promise<CostDelta>;
12
12
  /**
13
13
  * Clean up resources and connections
@@ -4,12 +4,14 @@ exports.PricingService = void 0;
4
4
  const CacheManager_1 = require("./CacheManager");
5
5
  const ALBCalculator_1 = require("./calculators/ALBCalculator");
6
6
  const APIGatewayCalculator_1 = require("./calculators/APIGatewayCalculator");
7
+ const AutoScalingGroupCalculator_1 = require("./calculators/AutoScalingGroupCalculator");
7
8
  const CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
8
9
  const DynamoDBCalculator_1 = require("./calculators/DynamoDBCalculator");
9
10
  const EC2Calculator_1 = require("./calculators/EC2Calculator");
10
11
  const ECSCalculator_1 = require("./calculators/ECSCalculator");
11
12
  const ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
12
13
  const LambdaCalculator_1 = require("./calculators/LambdaCalculator");
14
+ const LaunchTemplateCalculator_1 = require("./calculators/LaunchTemplateCalculator");
13
15
  const NatGatewayCalculator_1 = require("./calculators/NatGatewayCalculator");
14
16
  const NLBCalculator_1 = require("./calculators/NLBCalculator");
15
17
  const RDSCalculator_1 = require("./calculators/RDSCalculator");
@@ -51,9 +53,11 @@ class PricingService {
51
53
  new VPCEndpointCalculator_1.VPCEndpointCalculator(usageAssumptions?.vpcEndpoint?.dataProcessedGB),
52
54
  new CloudFrontCalculator_1.CloudFrontCalculator(usageAssumptions?.cloudfront?.dataTransferGB, usageAssumptions?.cloudfront?.requests),
53
55
  new ElastiCacheCalculator_1.ElastiCacheCalculator(),
56
+ new AutoScalingGroupCalculator_1.AutoScalingGroupCalculator(),
57
+ new LaunchTemplateCalculator_1.LaunchTemplateCalculator(),
54
58
  ];
55
59
  }
56
- async getResourceCost(resource, region) {
60
+ async getResourceCost(resource, region, templateResources) {
57
61
  // Check if resource type is excluded
58
62
  if (this.excludedResourceTypes.has(resource.type)) {
59
63
  return {
@@ -79,7 +83,7 @@ class PricingService {
79
83
  };
80
84
  }
81
85
  try {
82
- return await calculator.calculateCost(resource, region, this.pricingClient);
86
+ return await calculator.calculateCost(resource, region, this.pricingClient, templateResources);
83
87
  }
84
88
  catch (error) {
85
89
  return {
@@ -95,8 +99,18 @@ class PricingService {
95
99
  const filteredAdded = diff.added.filter(r => !this.excludedResourceTypes.has(r.type));
96
100
  const filteredRemoved = diff.removed.filter(r => !this.excludedResourceTypes.has(r.type));
97
101
  const filteredModified = diff.modified.filter(r => !this.excludedResourceTypes.has(r.type));
102
+ // Build template resource context from all resources in the diff
103
+ const allResources = [
104
+ ...diff.added,
105
+ ...diff.removed,
106
+ ...diff.modified.map(r => ({
107
+ logicalId: r.logicalId,
108
+ type: r.type,
109
+ properties: r.newProperties,
110
+ })),
111
+ ];
98
112
  const addedCosts = await Promise.all(filteredAdded.map(async (resource) => {
99
- const monthlyCost = await this.getResourceCost(resource, region);
113
+ const monthlyCost = await this.getResourceCost(resource, region, allResources);
100
114
  return {
101
115
  logicalId: resource.logicalId,
102
116
  type: resource.type,
@@ -104,7 +118,7 @@ class PricingService {
104
118
  };
105
119
  }));
106
120
  const removedCosts = await Promise.all(filteredRemoved.map(async (resource) => {
107
- const monthlyCost = await this.getResourceCost(resource, region);
121
+ const monthlyCost = await this.getResourceCost(resource, region, allResources);
108
122
  return {
109
123
  logicalId: resource.logicalId,
110
124
  type: resource.type,
@@ -122,8 +136,8 @@ class PricingService {
122
136
  type: resource.type,
123
137
  properties: resource.newProperties,
124
138
  };
125
- const oldMonthlyCost = await this.getResourceCost(oldResource, region);
126
- const newMonthlyCost = await this.getResourceCost(newResource, region);
139
+ const oldMonthlyCost = await this.getResourceCost(oldResource, region, allResources);
140
+ const newMonthlyCost = await this.getResourceCost(newResource, region, allResources);
127
141
  const costDelta = newMonthlyCost.amount - oldMonthlyCost.amount;
128
142
  return {
129
143
  logicalId: resource.logicalId,
@@ -154,4 +168,4 @@ class PricingService {
154
168
  }
155
169
  }
156
170
  exports.PricingService = PricingService;
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSw2RUFBMEU7QUFDMUUseUVBQXNFO0FBQ3RFLCtEQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQsK0VBQTRFO0FBQzVFLHFFQUFrRTtBQUNsRSw2RUFBMEU7QUFDMUUsK0RBQTREO0FBQzVELCtEQUE0RDtBQUM1RCw2REFBMEQ7QUFDMUQsK0VBQTRFO0FBQzVFLG1EQUFnRDtBQVVoRCxNQUFhLGNBQWM7SUFDakIsV0FBVyxDQUEyQjtJQUN0QyxhQUFhLENBQWdCO0lBQzdCLHFCQUFxQixDQUFjO0lBRTNDLFlBQ0UsU0FBaUIsV0FBVyxFQUM1QixnQkFBeUMsRUFDekMscUJBQWdDLEVBQ2hDLFdBQXlCLEVBQ3pCLGFBQTZCO1FBRTdCLGtEQUFrRDtRQUNsRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQWlEO1lBQ2pELElBQUksWUFBc0MsQ0FBQztZQUMzQyxJQUFJLFdBQVcsRUFBRSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sYUFBYSxHQUFHLFdBQVcsRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO2dCQUN2RCxZQUFZLEdBQUcsSUFBSSwyQkFBWSxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksNkJBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxFQUFF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QUFXLEVBQUUsY0FBYztnQkFDM0IsY0FBYztnQkFDZCxjQUFjO2dCQUNkLFNBQVM7YUFDVixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWxGLE1BQU0sVUFBVSxHQUFHLGNBQWMsR0FBRyxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztRQUUxRSxPQUFPO1lBQ0wsVUFBVTtZQUNWLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVTtZQUNWLFlBQVk7WUFDWixhQUFhO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQWxMRCx3Q0FrTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tICcuL0NhY2hlTWFuYWdlcic7XG5pbXBvcnQgeyBBTEJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9BTEJDYWxjdWxhdG9yJztcbmltcG9ydCB7IEFQSUdhdGV3YXlDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9BUElHYXRld2F5Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuaW1wb3J0IHsgRHluYW1vREJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9EeW5hbW9EQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgRUMyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUMyQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQ1NDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQ1NDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmltcG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTmF0R2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05hdEdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IE5MQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05MQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTM0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1MzQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBWUENFbmRwb2ludENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1ZQQ0VuZHBvaW50Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmltcG9ydCB7XG4gIFByaWNpbmdTZXJ2aWNlIGFzIElQcmljaW5nU2VydmljZSxcbiAgTW9udGhseUNvc3QsXG4gIENvc3REZWx0YSxcbiAgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLCBDYWNoZUNvbmZpZywgQ29zdEFuYWx5emVyQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IFJlc291cmNlV2l0aElkLCBSZXNvdXJjZURpZmYgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByaWNpbmdTZXJ2aWNlIGltcGxlbWVudHMgSVByaWNpbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWxjdWxhdG9yczogUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcltdO1xuICBwcml2YXRlIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQ7XG4gIHByaXZhdGUgZXhjbHVkZWRSZXNvdXJjZVR5cGVzOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWdpb246IHN0cmluZyA9ICd1cy1lYXN0LTEnLFxuICAgIHVzYWdlQXNzdW1wdGlvbnM/OiBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLFxuICAgIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdLFxuICAgIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWcsXG4gICAgcHJpY2luZ0NsaWVudD86IFByaWNpbmdDbGllbnQsXG4gICkge1xuICAgIC8vIFVzZSBwcm92aWRlZCBwcmljaW5nIGNsaWVudCBvciBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKHByaWNpbmdDbGllbnQpIHtcbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IHByaWNpbmdDbGllbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRpYWxpemUgY2FjaGUgbWFuYWdlciBpZiBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICAgIGxldCBjYWNoZU1hbmFnZXI6IENhY2hlTWFuYWdlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZUNvbmZpZz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY2FjaGVEdXJhdGlvbiA9IGNhY2hlQ29uZmlnPy5kdXJhdGlvbkhvdXJzID8/IDI0O1xuICAgICAgICBjYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKCcuY2RrLWNvc3QtYW5hbHl6ZXItY2FjaGUnLCBjYWNoZUR1cmF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmljaW5nQ2xpZW50ID0gbmV3IFByaWNpbmdDbGllbnQocmVnaW9uLCBjYWNoZU1hbmFnZXIpO1xuICAgIH1cbiAgICB0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyA9IG5ldyBTZXQoZXhjbHVkZWRSZXNvdXJjZVR5cGVzIHx8IFtdKTtcbiAgICBcbiAgICAvLyBCdWlsZCBjb25maWcgb2JqZWN0IGZvciBjYWxjdWxhdG9ycyB0aGF0IG5lZWQgaXRcbiAgICBjb25zdCBjb25maWc6IENvc3RBbmFseXplckNvbmZpZyB8IHVuZGVmaW5lZCA9IHVzYWdlQXNzdW1wdGlvbnMgPyB7IHVzYWdlQXNzdW1wdGlvbnMgfSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICB0aGlzLmNhbGN1bGF0b3JzID0gW1xuICAgICAgbmV3IEVDMkNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBTM0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYW1iZGFDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/Lmludm9jYXRpb25zUGVyTW9udGgsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmxhbWJkYT8uYXZlcmFnZUR1cmF0aW9uTXMsXG4gICAgICApLFxuICAgICAgbmV3IFJEU0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBEeW5hbW9EQkNhbGN1bGF0b3IoY29uZmlnKSxcbiAgICAgIG5ldyBFQ1NDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQVBJR2F0ZXdheUNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBOYXRHYXRld2F5Q2FsY3VsYXRvcih1c2FnZUFzc3VtcHRpb25zPy5uYXRHYXRld2F5Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IEFMQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgTkxCQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5uZXdDb25uZWN0aW9uc1BlclNlY29uZCxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5hY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZSxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5wcm9jZXNzZWRCeXRlc0dCLFxuICAgICAgKSxcbiAgICAgIG5ldyBWUENFbmRwb2ludENhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8udnBjRW5kcG9pbnQ/LmRhdGFQcm9jZXNzZWRHQiksXG4gICAgICBuZXcgQ2xvdWRGcm9udENhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmNsb3VkZnJvbnQ/LmRhdGFUcmFuc2ZlckdCLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5yZXF1ZXN0cyxcbiAgICAgICksXG4gICAgICBuZXcgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yKCksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIC8vIENoZWNrIGlmIHJlc291cmNlIHR5cGUgaXMgZXhjbHVkZWRcbiAgICBpZiAodGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMuaGFzKHJlc291cmNlLnR5cGUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ2hpZ2gnLFxuICAgICAgICBhc3N1bXB0aW9uczogW2BSZXNvdXJjZSB0eXBlICR7cmVzb3VyY2UudHlwZX0gaXMgZXhjbHVkZWQgZnJvbSBjb3N0IGFuYWx5c2lzYF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgY2FsY3VsYXRvciB1c2luZyBjYW5DYWxjdWxhdGUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHN1cHBvcnRzXG4gICAgY29uc3QgY2FsY3VsYXRvciA9IHRoaXMuY2FsY3VsYXRvcnMuZmluZChjYWxjID0+IHtcbiAgICAgIGlmIChjYWxjLmNhbkNhbGN1bGF0ZSkge1xuICAgICAgICByZXR1cm4gY2FsYy5jYW5DYWxjdWxhdGUocmVzb3VyY2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhbGMuc3VwcG9ydHMocmVzb3VyY2UudHlwZSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWNhbGN1bGF0b3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBub3Qgc3VwcG9ydGVkYF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsY3VsYXRvci5jYWxjdWxhdGVDb3N0KHJlc291cmNlLCByZWdpb24sIHRoaXMucHJpY2luZ0NsaWVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgICAgbW9udGhseUNvc3QsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVtb3ZlZENvc3RzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWx0ZXJlZFJlbW92ZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgICAgbW9udGhseUNvc3QsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgbW9kaWZpZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRNb2RpZmllZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCA9IHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld1Jlc291cmNlOiBSZXNvdXJjZVdpdGhJZCA9IHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb2xkTW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChvbGRSZXNvdXJjZSwgcmVnaW9uKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uKTtcbiAgICAgICAgY29uc3QgY29zdERlbHRhID0gbmV3TW9udGhseUNvc3QuYW1vdW50IC0gb2xkTW9udGhseUNvc3QuYW1vdW50O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdDogbmV3TW9udGhseUNvc3QsXG4gICAgICAgICAgb2xkTW9udGhseUNvc3QsXG4gICAgICAgICAgbmV3TW9udGhseUNvc3QsXG4gICAgICAgICAgY29zdERlbHRhLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IHRvdGFsQWRkZWRDb3N0ID0gYWRkZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsUmVtb3ZlZENvc3QgPSByZW1vdmVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIubW9udGhseUNvc3QuYW1vdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbE1vZGlmaWVkRGVsdGEgPSBtb2RpZmllZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLmNvc3REZWx0YSwgMCk7XG5cbiAgICBjb25zdCB0b3RhbERlbHRhID0gdG90YWxBZGRlZENvc3QgLSB0b3RhbFJlbW92ZWRDb3N0ICsgdG90YWxNb2RpZmllZERlbHRhO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRGVsdGEsXG4gICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICBhZGRlZENvc3RzLFxuICAgICAgcmVtb3ZlZENvc3RzLFxuICAgICAgbW9kaWZpZWRDb3N0cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlc291cmNlcyBhbmQgY29ubmVjdGlvbnNcbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5wcmljaW5nQ2xpZW50LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCwrRUFBNEU7QUFDNUUsbURBQWdEO0FBVWhELE1BQWEsY0FBYztJQUNqQixXQUFXLENBQTJCO0lBQ3RDLGFBQWEsQ0FBZ0I7SUFDN0IscUJBQXFCLENBQWM7SUFFM0MsWUFDRSxTQUFpQixXQUFXLEVBQzVCLGdCQUF5QyxFQUN6QyxxQkFBZ0MsRUFDaEMsV0FBeUIsRUFDekIsYUFBNkI7UUFFN0Isa0RBQWtEO1FBQ2xELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixpREFBaUQ7WUFDakQsSUFBSSxZQUFzQyxDQUFDO1lBQzNDLElBQUksV0FBVyxFQUFFLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxhQUFhLEdBQUcsV0FBVyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFlBQVksR0FBRyxJQUFJLDJCQUFZLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUks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YyxHQUFHLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO1FBRTFFLE9BQU87WUFDTCxVQUFVO1lBQ1YsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVO1lBQ1YsWUFBWTtZQUNaLGFBQWE7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBL0xELHdDQStMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmltcG9ydCB7IEFMQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FMQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQVBJR2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FQSUdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9BdXRvU2NhbGluZ0dyb3VwQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuaW1wb3J0IHsgRHluYW1vREJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9EeW5hbW9EQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgRUMyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUMyQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQ1NDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQ1NDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmltcG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTmF0R2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05hdEdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IE5MQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05MQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTM0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1MzQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBWUENFbmRwb2ludENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1ZQQ0VuZHBvaW50Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmltcG9ydCB7XG4gIFByaWNpbmdTZXJ2aWNlIGFzIElQcmljaW5nU2VydmljZSxcbiAgTW9udGhseUNvc3QsXG4gIENvc3REZWx0YSxcbiAgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLCBDYWNoZUNvbmZpZywgQ29zdEFuYWx5emVyQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IFJlc291cmNlV2l0aElkLCBSZXNvdXJjZURpZmYgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByaWNpbmdTZXJ2aWNlIGltcGxlbWVudHMgSVByaWNpbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWxjdWxhdG9yczogUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcltdO1xuICBwcml2YXRlIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQ7XG4gIHByaXZhdGUgZXhjbHVkZWRSZXNvdXJjZVR5cGVzOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWdpb246IHN0cmluZyA9ICd1cy1lYXN0LTEnLFxuICAgIHVzYWdlQXNzdW1wdGlvbnM/OiBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLFxuICAgIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdLFxuICAgIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWcsXG4gICAgcHJpY2luZ0NsaWVudD86IFByaWNpbmdDbGllbnQsXG4gICkge1xuICAgIC8vIFVzZSBwcm92aWRlZCBwcmljaW5nIGNsaWVudCBvciBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKHByaWNpbmdDbGllbnQpIHtcbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IHByaWNpbmdDbGllbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRpYWxpemUgY2FjaGUgbWFuYWdlciBpZiBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICAgIGxldCBjYWNoZU1hbmFnZXI6IENhY2hlTWFuYWdlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZUNvbmZpZz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY2FjaGVEdXJhdGlvbiA9IGNhY2hlQ29uZmlnPy5kdXJhdGlvbkhvdXJzID8/IDI0O1xuICAgICAgICBjYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKCcuY2RrLWNvc3QtYW5hbHl6ZXItY2FjaGUnLCBjYWNoZUR1cmF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmljaW5nQ2xpZW50ID0gbmV3IFByaWNpbmdDbGllbnQocmVnaW9uLCBjYWNoZU1hbmFnZXIpO1xuICAgIH1cbiAgICB0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyA9IG5ldyBTZXQoZXhjbHVkZWRSZXNvdXJjZVR5cGVzIHx8IFtdKTtcbiAgICBcbiAgICAvLyBCdWlsZCBjb25maWcgb2JqZWN0IGZvciBjYWxjdWxhdG9ycyB0aGF0IG5lZWQgaXRcbiAgICBjb25zdCBjb25maWc6IENvc3RBbmFseXplckNvbmZpZyB8IHVuZGVmaW5lZCA9IHVzYWdlQXNzdW1wdGlvbnMgPyB7IHVzYWdlQXNzdW1wdGlvbnMgfSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICB0aGlzLmNhbGN1bGF0b3JzID0gW1xuICAgICAgbmV3IEVDMkNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBTM0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYW1iZGFDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/Lmludm9jYXRpb25zUGVyTW9udGgsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmxhbWJkYT8uYXZlcmFnZUR1cmF0aW9uTXMsXG4gICAgICApLFxuICAgICAgbmV3IFJEU0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBEeW5hbW9EQkNhbGN1bGF0b3IoY29uZmlnKSxcbiAgICAgIG5ldyBFQ1NDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQVBJR2F0ZXdheUNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBOYXRHYXRld2F5Q2FsY3VsYXRvcih1c2FnZUFzc3VtcHRpb25zPy5uYXRHYXRld2F5Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IEFMQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgTkxCQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5uZXdDb25uZWN0aW9uc1BlclNlY29uZCxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5hY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZSxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5wcm9jZXNzZWRCeXRlc0dCLFxuICAgICAgKSxcbiAgICAgIG5ldyBWUENFbmRwb2ludENhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8udnBjRW5kcG9pbnQ/LmRhdGFQcm9jZXNzZWRHQiksXG4gICAgICBuZXcgQ2xvdWRGcm9udENhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmNsb3VkZnJvbnQ/LmRhdGFUcmFuc2ZlckdCLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5yZXF1ZXN0cyxcbiAgICAgICksXG4gICAgICBuZXcgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IoKSxcbiAgICBdO1xuICB9XG5cbiAgYXN5bmMgZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCwgcmVnaW9uOiBzdHJpbmcsIHRlbXBsYXRlUmVzb3VyY2VzPzogUmVzb3VyY2VXaXRoSWRbXSk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICAvLyBDaGVjayBpZiByZXNvdXJjZSB0eXBlIGlzIGV4Y2x1ZGVkXG4gICAgaWYgKHRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyZXNvdXJjZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICdoaWdoJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIGV4Y2x1ZGVkIGZyb20gY29zdCBhbmFseXNpc2BdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGNhbGN1bGF0b3IgdXNpbmcgY2FuQ2FsY3VsYXRlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBzdXBwb3J0c1xuICAgIGNvbnN0IGNhbGN1bGF0b3IgPSB0aGlzLmNhbGN1bGF0b3JzLmZpbmQoY2FsYyA9PiB7XG4gICAgICBpZiAoY2FsYy5jYW5DYWxjdWxhdGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGMuY2FuQ2FsY3VsYXRlKHJlc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWxjLnN1cHBvcnRzKHJlc291cmNlLnR5cGUpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFjYWxjdWxhdG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW2BSZXNvdXJjZSB0eXBlICR7cmVzb3VyY2UudHlwZX0gaXMgbm90IHN1cHBvcnRlZGBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGN1bGF0b3IuY2FsY3VsYXRlQ29zdChyZXNvdXJjZSwgcmVnaW9uLCB0aGlzLnByaWNpbmdDbGllbnQsIHRlbXBsYXRlUmVzb3VyY2VzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgRmFpbGVkIHRvIGNhbGN1bGF0ZSBjb3N0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29zdERlbHRhKGRpZmY6IFJlc291cmNlRGlmZiwgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPENvc3REZWx0YT4ge1xuICAgIC8vIEZpbHRlciBvdXQgZXhjbHVkZWQgcmVzb3VyY2VzIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgY29uc3QgZmlsdGVyZWRBZGRlZCA9IGRpZmYuYWRkZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcbiAgICBjb25zdCBmaWx0ZXJlZFJlbW92ZWQgPSBkaWZmLnJlbW92ZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcbiAgICBjb25zdCBmaWx0ZXJlZE1vZGlmaWVkID0gZGlmZi5tb2RpZmllZC5maWx0ZXIociA9PiAhdGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMuaGFzKHIudHlwZSkpO1xuXG4gICAgLy8gQnVpbGQgdGVtcGxhdGUgcmVzb3VyY2UgY29udGV4dCBmcm9tIGFsbCByZXNvdXJjZXMgaW4gdGhlIGRpZmZcbiAgICBjb25zdCBhbGxSZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10gPSBbXG4gICAgICAuLi5kaWZmLmFkZGVkLFxuICAgICAgLi4uZGlmZi5yZW1vdmVkLFxuICAgICAgLi4uZGlmZi5tb2RpZmllZC5tYXAociA9PiAoe1xuICAgICAgICBsb2dpY2FsSWQ6IHIubG9naWNhbElkLFxuICAgICAgICB0eXBlOiByLnR5cGUsXG4gICAgICAgIHByb3BlcnRpZXM6IHIubmV3UHJvcGVydGllcyxcbiAgICAgIH0pKSxcbiAgICBdO1xuXG4gICAgY29uc3QgYWRkZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRBZGRlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlbW92ZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRSZW1vdmVkLm1hcChhc3luYyAocmVzb3VyY2UpID0+IHtcbiAgICAgICAgY29uc3QgbW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChyZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgICAgbW9udGhseUNvc3QsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgbW9kaWZpZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRNb2RpZmllZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCA9IHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld1Jlc291cmNlOiBSZXNvdXJjZVdpdGhJZCA9IHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb2xkTW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChvbGRSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBuZXdNb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KG5ld1Jlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIGNvbnN0IGNvc3REZWx0YSA9IG5ld01vbnRobHlDb3N0LmFtb3VudCAtIG9sZE1vbnRobHlDb3N0LmFtb3VudDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgICAgbW9udGhseUNvc3Q6IG5ld01vbnRobHlDb3N0LFxuICAgICAgICAgIG9sZE1vbnRobHlDb3N0LFxuICAgICAgICAgIG5ld01vbnRobHlDb3N0LFxuICAgICAgICAgIGNvc3REZWx0YSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCB0b3RhbEFkZGVkQ29zdCA9IGFkZGVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIubW9udGhseUNvc3QuYW1vdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbFJlbW92ZWRDb3N0ID0gcmVtb3ZlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxNb2RpZmllZERlbHRhID0gbW9kaWZpZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5jb3N0RGVsdGEsIDApO1xuXG4gICAgY29uc3QgdG90YWxEZWx0YSA9IHRvdGFsQWRkZWRDb3N0IC0gdG90YWxSZW1vdmVkQ29zdCArIHRvdGFsTW9kaWZpZWREZWx0YTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbERlbHRhLFxuICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgYWRkZWRDb3N0cyxcbiAgICAgIHJlbW92ZWRDb3N0cyxcbiAgICAgIG1vZGlmaWVkQ29zdHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCByZXNvdXJjZXMgYW5kIGNvbm5lY3Rpb25zXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucHJpY2luZ0NsaWVudC5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
3
+ export declare class AutoScalingGroupCalculator implements ResourceCostCalculator {
4
+ supports(resourceType: string): boolean;
5
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient, templateResources?: ResourceWithId[]): Promise<MonthlyCost>;
6
+ private resolveInstanceType;
7
+ private resolveInstanceTypeFromLaunchTemplate;
8
+ private resolveReference;
9
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AutoScalingGroupCalculator = void 0;
4
+ const RegionMapper_1 = require("../RegionMapper");
5
+ class AutoScalingGroupCalculator {
6
+ supports(resourceType) {
7
+ return resourceType === 'AWS::AutoScaling::AutoScalingGroup';
8
+ }
9
+ async calculateCost(resource, region, pricingClient, templateResources) {
10
+ const desiredCapacity = Number(resource.properties.DesiredCapacity) || 1;
11
+ const instanceType = this.resolveInstanceType(resource, templateResources);
12
+ if (!instanceType) {
13
+ return {
14
+ amount: 0,
15
+ currency: 'USD',
16
+ confidence: 'unknown',
17
+ assumptions: ['Could not determine instance type from LaunchConfiguration or LaunchTemplate'],
18
+ };
19
+ }
20
+ try {
21
+ const hourlyRate = await pricingClient.getPrice({
22
+ serviceCode: 'AmazonEC2',
23
+ region: (0, RegionMapper_1.normalizeRegion)(region),
24
+ filters: [
25
+ { field: 'instanceType', value: instanceType },
26
+ { field: 'operatingSystem', value: 'Linux' },
27
+ { field: 'tenancy', value: 'Shared' },
28
+ { field: 'preInstalledSw', value: 'NA' },
29
+ { field: 'capacitystatus', value: 'Used' },
30
+ ],
31
+ });
32
+ if (hourlyRate === null) {
33
+ return {
34
+ amount: 0,
35
+ currency: 'USD',
36
+ confidence: 'unknown',
37
+ assumptions: [`Pricing data not available for instance type ${instanceType} in region ${region}`],
38
+ };
39
+ }
40
+ const monthlyHours = 730;
41
+ const monthlyCost = hourlyRate * monthlyHours * desiredCapacity;
42
+ return {
43
+ amount: monthlyCost,
44
+ currency: 'USD',
45
+ confidence: 'medium',
46
+ assumptions: [
47
+ `${desiredCapacity} instance(s) of type ${instanceType}`,
48
+ `Assumes ${monthlyHours} hours per month (24/7 operation)`,
49
+ 'Assumes Linux OS, shared tenancy, on-demand pricing',
50
+ 'Does not include EBS volumes or data transfer costs',
51
+ ],
52
+ };
53
+ }
54
+ catch (error) {
55
+ return {
56
+ amount: 0,
57
+ currency: 'USD',
58
+ confidence: 'unknown',
59
+ assumptions: [`Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`],
60
+ };
61
+ }
62
+ }
63
+ resolveInstanceType(resource, templateResources) {
64
+ // Try LaunchConfigurationName
65
+ const launchConfigRef = resource.properties.LaunchConfigurationName;
66
+ if (launchConfigRef) {
67
+ const resolved = this.resolveReference(launchConfigRef, templateResources);
68
+ if (resolved && resolved.type === 'AWS::AutoScaling::LaunchConfiguration') {
69
+ const instanceType = resolved.properties.InstanceType;
70
+ if (instanceType)
71
+ return instanceType;
72
+ }
73
+ }
74
+ // Try LaunchTemplate
75
+ const launchTemplate = resource.properties.LaunchTemplate;
76
+ if (launchTemplate) {
77
+ const instanceType = this.resolveInstanceTypeFromLaunchTemplate(launchTemplate, templateResources);
78
+ if (instanceType)
79
+ return instanceType;
80
+ }
81
+ // Try MixedInstancesPolicy
82
+ const mixedPolicy = resource.properties.MixedInstancesPolicy;
83
+ if (mixedPolicy) {
84
+ const launchTemplateSpec = mixedPolicy.LaunchTemplate;
85
+ if (launchTemplateSpec) {
86
+ const ltSpec = launchTemplateSpec.LaunchTemplateSpecification;
87
+ if (ltSpec) {
88
+ const instanceType = this.resolveInstanceTypeFromLaunchTemplate(ltSpec, templateResources);
89
+ if (instanceType)
90
+ return instanceType;
91
+ }
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ resolveInstanceTypeFromLaunchTemplate(launchTemplateRef, templateResources) {
97
+ const ref = launchTemplateRef.LaunchTemplateId || launchTemplateRef.LaunchTemplateName;
98
+ if (!ref)
99
+ return null;
100
+ const resolved = this.resolveReference(ref, templateResources);
101
+ if (resolved && resolved.type === 'AWS::EC2::LaunchTemplate') {
102
+ const launchTemplateData = resolved.properties.LaunchTemplateData;
103
+ if (launchTemplateData) {
104
+ return launchTemplateData.InstanceType || null;
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ resolveReference(ref, templateResources) {
110
+ if (!templateResources)
111
+ return null;
112
+ // Handle { Ref: 'LogicalId' }
113
+ if (typeof ref === 'object' && ref !== null && 'Ref' in ref) {
114
+ const logicalId = ref.Ref;
115
+ return templateResources.find(r => r.logicalId === logicalId) || null;
116
+ }
117
+ // Handle string logical ID
118
+ if (typeof ref === 'string') {
119
+ return templateResources.find(r => r.logicalId === ref) || null;
120
+ }
121
+ return null;
122
+ }
123
+ }
124
+ exports.AutoScalingGroupCalculator = AutoScalingGroupCalculator;
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJpY2luZy9jYWxjdWxhdG9ycy9BdXRvU2NhbGluZ0dyb3VwQ2FsY3VsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxrREFBa0Q7QUFFbEQsTUFBYSwwQkFBMEI7SUFDckMsUUFBUSxDQUFDLFlBQW9CO1FBQzNCLE9BQU8sWUFBWSxLQUFLLG9DQUFvQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUNqQixRQUF3QixFQUN4QixNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsaUJBQW9DO1FBRXBDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFM0UsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFdBQVcsRUFBRSxDQUFDLDhFQUE4RSxDQUFDO2FBQzlGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUM5QyxXQUFXLEVBQUUsV0FBVztnQkFDeEIsTUFBTSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtvQkFDOUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtvQkFDNUMsRUFBRSxL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QztZQUM1QixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQ2xFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTlJRCxnRUE4SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciwgTW9udGhseUNvc3QsIFByaWNpbmdDbGllbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVSZWdpb24gfSBmcm9tICcuLi9SZWdpb25NYXBwZXInO1xuXG5leHBvcnQgY2xhc3MgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IgaW1wbGVtZW50cyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yIHtcbiAgc3VwcG9ydHMocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VUeXBlID09PSAnQVdTOjpBdXRvU2NhbGluZzo6QXV0b1NjYWxpbmdHcm91cCc7XG4gIH1cblxuICBhc3luYyBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICAgIHRlbXBsYXRlUmVzb3VyY2VzPzogUmVzb3VyY2VXaXRoSWRbXSxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IGRlc2lyZWRDYXBhY2l0eSA9IE51bWJlcihyZXNvdXJjZS5wcm9wZXJ0aWVzLkRlc2lyZWRDYXBhY2l0eSkgfHwgMTtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSB0aGlzLnJlc29sdmVJbnN0YW5jZVR5cGUocmVzb3VyY2UsIHRlbXBsYXRlUmVzb3VyY2VzKTtcblxuICAgIGlmICghaW5zdGFuY2VUeXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogWydDb3VsZCBub3QgZGV0ZXJtaW5lIGluc3RhbmNlIHR5cGUgZnJvbSBMYXVuY2hDb25maWd1cmF0aW9uIG9yIExhdW5jaFRlbXBsYXRlJ10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3VybHlSYXRlID0gYXdhaXQgcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uRUMyJyxcbiAgICAgICAgcmVnaW9uOiBub3JtYWxpemVSZWdpb24ocmVnaW9uKSxcbiAgICAgICAgZmlsdGVyczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdpbnN0YW5jZVR5cGUnLCB2YWx1ZTogaW5zdGFuY2VUeXBlIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ29wZXJhdGluZ1N5c3RlbScsIHZhbHVlOiAnTGludXgnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3RlbmFuY3knLCB2YWx1ZTogJ1NoYXJlZCcgfSxcbiAgICAgICAgICB7IGZpZWxkOiAncHJlSW5zdGFsbGVkU3cnLCB2YWx1ZTogJ05BJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdjYXBhY2l0eXN0YXR1cycsIHZhbHVlOiAnVXNlZCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaG91cmx5UmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbYFByaWNpbmcgZGF0YSBub3QgYXZhaWxhYmxlIGZvciBpbnN0YW5jZSB0eXBlICR7aW5zdGFuY2VUeXBlfSBpbiByZWdpb24gJHtyZWdpb259YF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vbnRobHlIb3VycyA9IDczMDtcbiAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gaG91cmx5UmF0ZSAqIG1vbnRobHlIb3VycyAqIGRlc2lyZWRDYXBhY2l0eTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiBtb250aGx5Q29zdCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnbWVkaXVtJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICBgJHtkZXNpcmVkQ2FwYWNpdHl9IGluc3RhbmNlKHMpIG9mIHR5cGUgJHtpbnN0YW5jZVR5cGV9YCxcbiAgICAgICAgICBgQXNzdW1lcyAke21vbnRobHlIb3Vyc30gaG91cnMgcGVyIG1vbnRoICgyNC83IG9wZXJhdGlvbilgLFxuICAgICAgICAgICdBc3N1bWVzIExpbnV4IE9TLCBzaGFyZWQgdGVuYW5jeSwgb24tZGVtYW5kIHByaWNpbmcnLFxuICAgICAgICAgICdEb2VzIG5vdCBpbmNsdWRlIEVCUyB2b2x1bWVzIG9yIGRhdGEgdHJhbnNmZXIgY29zdHMnLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgRmFpbGVkIHRvIGZldGNoIHByaWNpbmc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVJbnN0YW5jZVR5cGUoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHRlbXBsYXRlUmVzb3VyY2VzPzogUmVzb3VyY2VXaXRoSWRbXSxcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVHJ5IExhdW5jaENvbmZpZ3VyYXRpb25OYW1lXG4gICAgY29uc3QgbGF1bmNoQ29uZmlnUmVmID0gcmVzb3VyY2UucHJvcGVydGllcy5MYXVuY2hDb25maWd1cmF0aW9uTmFtZTtcbiAgICBpZiAobGF1bmNoQ29uZmlnUmVmKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZVJlZmVyZW5jZShsYXVuY2hDb25maWdSZWYsIHRlbXBsYXRlUmVzb3VyY2VzKTtcbiAgICAgIGlmIChyZXNvbHZlZCAmJiByZXNvbHZlZC50eXBlID09PSAnQVdTOjpBdXRvU2NhbGluZzo6TGF1bmNoQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VUeXBlID0gcmVzb2x2ZWQucHJvcGVydGllcy5JbnN0YW5jZVR5cGUgYXMgc3RyaW5nO1xuICAgICAgICBpZiAoaW5zdGFuY2VUeXBlKSByZXR1cm4gaW5zdGFuY2VUeXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSBMYXVuY2hUZW1wbGF0ZVxuICAgIGNvbnN0IGxhdW5jaFRlbXBsYXRlID0gcmVzb3VyY2UucHJvcGVydGllcy5MYXVuY2hUZW1wbGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobGF1bmNoVGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IHRoaXMucmVzb2x2ZUluc3RhbmNlVHlwZUZyb21MYXVuY2hUZW1wbGF0ZShsYXVuY2hUZW1wbGF0ZSwgdGVtcGxhdGVSZXNvdXJjZXMpO1xuICAgICAgaWYgKGluc3RhbmNlVHlwZSkgcmV0dXJuIGluc3RhbmNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgTWl4ZWRJbnN0YW5jZXNQb2xpY3lcbiAgICBjb25zdCBtaXhlZFBvbGljeSA9IHJlc291cmNlLnByb3BlcnRpZXMuTWl4ZWRJbnN0YW5jZXNQb2xpY3kgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKG1peGVkUG9saWN5KSB7XG4gICAgICBjb25zdCBsYXVuY2hUZW1wbGF0ZVNwZWMgPSBtaXhlZFBvbGljeS5MYXVuY2hUZW1wbGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChsYXVuY2hUZW1wbGF0ZVNwZWMpIHtcbiAgICAgICAgY29uc3QgbHRTcGVjID0gbGF1bmNoVGVtcGxhdGVTcGVjLkxhdW5jaFRlbXBsYXRlU3BlY2lmaWNhdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGx0U3BlYykge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IHRoaXMucmVzb2x2ZUluc3RhbmNlVHlwZUZyb21MYXVuY2hUZW1wbGF0ZShsdFNwZWMsIHRlbXBsYXRlUmVzb3VyY2VzKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VUeXBlKSByZXR1cm4gaW5zdGFuY2VUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVJbnN0YW5jZVR5cGVGcm9tTGF1bmNoVGVtcGxhdGUoXG4gICAgbGF1bmNoVGVtcGxhdGVSZWY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHRlbXBsYXRlUmVzb3VyY2VzPzogUmVzb3VyY2VXaXRoSWRbXSxcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcmVmID0gbGF1bmNoVGVtcGxhdGVSZWYuTGF1bmNoVGVtcGxhdGVJZCB8fCBsYXVuY2hUZW1wbGF0ZVJlZi5MYXVuY2hUZW1wbGF0ZU5hbWU7XG4gICAgaWYgKCFyZWYpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVSZWZlcmVuY2UocmVmLCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgaWYgKHJlc29sdmVkICYmIHJlc29sdmVkLnR5cGUgPT09ICdBV1M6OkVDMjo6TGF1bmNoVGVtcGxhdGUnKSB7XG4gICAgICBjb25zdCBsYXVuY2hUZW1wbGF0ZURhdGEgPSByZXNvbHZlZC5wcm9wZXJ0aWVzLkxhdW5jaFRlbXBsYXRlRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChsYXVuY2hUZW1wbGF0ZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIChsYXVuY2hUZW1wbGF0ZURhdGEuSW5zdGFuY2VUeXBlIGFzIHN0cmluZykgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVSZWZlcmVuY2UoXG4gICAgcmVmOiB1bmtub3duLFxuICAgIHRlbXBsYXRlUmVzb3VyY2VzPzogUmVzb3VyY2VXaXRoSWRbXSxcbiAgKTogUmVzb3VyY2VXaXRoSWQgfCBudWxsIHtcbiAgICBpZiAoIXRlbXBsYXRlUmVzb3VyY2VzKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEhhbmRsZSB7IFJlZjogJ0xvZ2ljYWxJZCcgfVxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJiByZWYgIT09IG51bGwgJiYgJ1JlZicgaW4gcmVmKSB7XG4gICAgICBjb25zdCBsb2dpY2FsSWQgPSAocmVmIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5SZWYgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIHRlbXBsYXRlUmVzb3VyY2VzLmZpbmQociA9PiByLmxvZ2ljYWxJZCA9PT0gbG9naWNhbElkKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzdHJpbmcgbG9naWNhbCBJRFxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlUmVzb3VyY2VzLmZpbmQociA9PiByLmxvZ2ljYWxJZCA9PT0gcmVmKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
3
+ /**
4
+ * Configuration extracted from a LaunchTemplate's LaunchTemplateData.
5
+ * This interface can be used by other calculators (e.g., AutoScalingGroupCalculator)
6
+ * to reference instance configuration.
7
+ */
8
+ export interface LaunchTemplateConfig {
9
+ instanceType: string | null;
10
+ imageId: string | null;
11
+ ebsVolumes: EbsVolumeConfig[];
12
+ }
13
+ export interface EbsVolumeConfig {
14
+ deviceName: string;
15
+ volumeType: string;
16
+ volumeSizeGB: number;
17
+ iops?: number;
18
+ throughput?: number;
19
+ deleteOnTermination: boolean;
20
+ }
21
+ export declare class LaunchTemplateCalculator implements ResourceCostCalculator {
22
+ private static readonly DEFAULT_VOLUME_SIZE_GB;
23
+ private static readonly DEFAULT_VOLUME_TYPE;
24
+ private static readonly MONTHLY_HOURS;
25
+ supports(resourceType: string): boolean;
26
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
27
+ /**
28
+ * Extract configuration from a LaunchTemplate resource.
29
+ * This method is public to allow other calculators to use it.
30
+ */
31
+ extractConfig(resource: ResourceWithId): LaunchTemplateConfig;
32
+ private extractEbsVolumes;
33
+ private calculateInstanceCost;
34
+ private calculateStorageCost;
35
+ }
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LaunchTemplateCalculator = void 0;
4
+ const RegionMapper_1 = require("../RegionMapper");
5
+ class LaunchTemplateCalculator {
6
+ static DEFAULT_VOLUME_SIZE_GB = 8;
7
+ static DEFAULT_VOLUME_TYPE = 'gp3';
8
+ static MONTHLY_HOURS = 730;
9
+ supports(resourceType) {
10
+ return resourceType === 'AWS::EC2::LaunchTemplate';
11
+ }
12
+ async calculateCost(resource, region, pricingClient) {
13
+ const config = this.extractConfig(resource);
14
+ if (!config.instanceType) {
15
+ return {
16
+ amount: 0,
17
+ currency: 'USD',
18
+ confidence: 'unknown',
19
+ assumptions: [
20
+ 'LaunchTemplate does not specify an instance type',
21
+ 'LaunchTemplates have no direct cost; costs are incurred when instances are launched',
22
+ ],
23
+ };
24
+ }
25
+ try {
26
+ // Calculate the cost for a single instance using this template
27
+ const instanceCost = await this.calculateInstanceCost(config.instanceType, region, pricingClient);
28
+ if (instanceCost === 0) {
29
+ return {
30
+ amount: 0,
31
+ currency: 'USD',
32
+ confidence: 'unknown',
33
+ assumptions: [
34
+ `Pricing data not available for instance type ${config.instanceType} in region ${region}`,
35
+ ],
36
+ };
37
+ }
38
+ const storageCost = await this.calculateStorageCost(config.ebsVolumes, region, pricingClient);
39
+ const totalPerInstanceCost = instanceCost + storageCost;
40
+ const assumptions = [
41
+ 'LaunchTemplates have no direct cost; this represents per-instance cost when used',
42
+ `Instance type: ${config.instanceType}`,
43
+ `Assumes ${LaunchTemplateCalculator.MONTHLY_HOURS} hours per month (24/7 operation)`,
44
+ 'Assumes Linux OS, shared tenancy, on-demand pricing',
45
+ ];
46
+ if (config.ebsVolumes.length > 0) {
47
+ const volumeDescriptions = config.ebsVolumes.map((v) => `${v.deviceName}: ${v.volumeSizeGB}GB ${v.volumeType}`);
48
+ assumptions.push(`EBS volumes: ${volumeDescriptions.join(', ')}`);
49
+ }
50
+ const hasProvisionedIops = config.ebsVolumes.some((v) => (v.volumeType === 'io1' || v.volumeType === 'io2') && v.iops);
51
+ if (hasProvisionedIops) {
52
+ assumptions.push('Provisioned IOPS costs for io1/io2 volumes are not included');
53
+ }
54
+ const hasThroughput = config.ebsVolumes.some((v) => v.volumeType === 'gp3' && v.throughput && v.throughput > 125);
55
+ if (hasThroughput) {
56
+ assumptions.push('Additional throughput costs for gp3 volumes are not included');
57
+ }
58
+ if (config.imageId) {
59
+ assumptions.push(`AMI: ${config.imageId}`);
60
+ }
61
+ return {
62
+ amount: totalPerInstanceCost,
63
+ currency: 'USD',
64
+ confidence: 'low',
65
+ assumptions,
66
+ };
67
+ }
68
+ catch (error) {
69
+ return {
70
+ amount: 0,
71
+ currency: 'USD',
72
+ confidence: 'unknown',
73
+ assumptions: [
74
+ `Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`,
75
+ ],
76
+ };
77
+ }
78
+ }
79
+ /**
80
+ * Extract configuration from a LaunchTemplate resource.
81
+ * This method is public to allow other calculators to use it.
82
+ */
83
+ extractConfig(resource) {
84
+ const launchTemplateData = resource.properties.LaunchTemplateData;
85
+ if (!launchTemplateData) {
86
+ return {
87
+ instanceType: null,
88
+ imageId: null,
89
+ ebsVolumes: [],
90
+ };
91
+ }
92
+ const instanceType = launchTemplateData.InstanceType || null;
93
+ const imageId = launchTemplateData.ImageId || null;
94
+ const ebsVolumes = this.extractEbsVolumes(launchTemplateData);
95
+ return {
96
+ instanceType,
97
+ imageId,
98
+ ebsVolumes,
99
+ };
100
+ }
101
+ extractEbsVolumes(launchTemplateData) {
102
+ const blockDeviceMappings = launchTemplateData.BlockDeviceMappings;
103
+ if (!blockDeviceMappings || !Array.isArray(blockDeviceMappings)) {
104
+ return [];
105
+ }
106
+ return blockDeviceMappings
107
+ .filter((mapping) => mapping.Ebs !== undefined)
108
+ .map((mapping) => {
109
+ const ebs = mapping.Ebs;
110
+ return {
111
+ deviceName: mapping.DeviceName || '/dev/xvda',
112
+ volumeType: ebs.VolumeType ||
113
+ LaunchTemplateCalculator.DEFAULT_VOLUME_TYPE,
114
+ volumeSizeGB: ebs.VolumeSize ||
115
+ LaunchTemplateCalculator.DEFAULT_VOLUME_SIZE_GB,
116
+ iops: ebs.Iops,
117
+ throughput: ebs.Throughput,
118
+ deleteOnTermination: ebs.DeleteOnTermination ?? true,
119
+ };
120
+ });
121
+ }
122
+ async calculateInstanceCost(instanceType, region, pricingClient) {
123
+ const hourlyRate = await pricingClient.getPrice({
124
+ serviceCode: 'AmazonEC2',
125
+ region: (0, RegionMapper_1.normalizeRegion)(region),
126
+ filters: [
127
+ { field: 'instanceType', value: instanceType },
128
+ { field: 'operatingSystem', value: 'Linux' },
129
+ { field: 'tenancy', value: 'Shared' },
130
+ { field: 'preInstalledSw', value: 'NA' },
131
+ { field: 'capacitystatus', value: 'Used' },
132
+ ],
133
+ });
134
+ if (hourlyRate === null) {
135
+ return 0;
136
+ }
137
+ return hourlyRate * LaunchTemplateCalculator.MONTHLY_HOURS;
138
+ }
139
+ async calculateStorageCost(ebsVolumes, region, pricingClient) {
140
+ if (ebsVolumes.length === 0) {
141
+ return 0;
142
+ }
143
+ let totalStorageCost = 0;
144
+ for (const volume of ebsVolumes) {
145
+ const pricePerGBMonth = await pricingClient.getPrice({
146
+ serviceCode: 'AmazonEC2',
147
+ region: (0, RegionMapper_1.normalizeRegion)(region),
148
+ filters: [
149
+ { field: 'productFamily', value: 'Storage' },
150
+ { field: 'volumeApiName', value: volume.volumeType.toLowerCase() },
151
+ ],
152
+ });
153
+ if (pricePerGBMonth !== null) {
154
+ totalStorageCost += pricePerGBMonth * volume.volumeSizeGB;
155
+ }
156
+ }
157
+ return totalStorageCost;
158
+ }
159
+ }
160
+ exports.LaunchTemplateCalculator = LaunchTemplateCalculator;
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaWNpbmcvY2FsY3VsYXRvcnMvTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGtEQUFrRDtBQXNCbEQsTUFBYSx3QkFBd0I7SUFDM0IsTUFBTSxDQUFVLHNCQUFzQixHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQVUsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQzVDLE1BQU0sQ0FBVSxhQUFhLEdBQUcsR0FBRyxDQUFDO0lBRTVDLFFBQVEsQ0FBQyxZQUFvQjtRQUMzQixPQUFPLFlBQVksS0FBSywwQkFBMEIsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FDakIsUUFBd0IsRUFDeEIsTUFBYyxFQUNkLGFBQTRCO1FBRTVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixPQUFPO2dCQUNMLE1BQU0sRUFBRSxDQUFDO2dCQUNULFFBQVEsRUFBRSxLQUFLO2dCQUNmLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixXQUFXLEVBQUU7b0JBQ1gsa0RBQWtEO29CQUNsRCxxRkFBcUY7aUJBQ3RGO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCwrREFBK0Q7WUFDL0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQ25ELE1BQU0sQ0FBQyxZQUFZLEVBQ25CLE1BQU0sRUFDTixhQUFhLENBQ2QsQ0FBQztZQUVGLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPO29CQUNMLE1BQU0sRUFBRSxDQUFDO29CQUNULFFBQVEsRUFBRSxLQUFLO29CQUNmLFVBQVUsRUFBRSxT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TUFBTSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtvQkFDNUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFO2lCQUNuRTthQUNGLENBQUMsQ0FBQztZQUVILElBQUksZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM3QixnQkFBZ0IsSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzs7QUF0TkgsNERBd05DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzb3VyY2VXaXRoSWQgfSBmcm9tICcuLi8uLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IFJlc291cmNlQ29zdENhbGN1bGF0b3IsIE1vbnRobHlDb3N0LCBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgbm9ybWFsaXplUmVnaW9uIH0gZnJvbSAnLi4vUmVnaW9uTWFwcGVyJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGV4dHJhY3RlZCBmcm9tIGEgTGF1bmNoVGVtcGxhdGUncyBMYXVuY2hUZW1wbGF0ZURhdGEuXG4gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBvdGhlciBjYWxjdWxhdG9ycyAoZS5nLiwgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IpXG4gKiB0byByZWZlcmVuY2UgaW5zdGFuY2UgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXVuY2hUZW1wbGF0ZUNvbmZpZyB7XG4gIGluc3RhbmNlVHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgaW1hZ2VJZDogc3RyaW5nIHwgbnVsbDtcbiAgZWJzVm9sdW1lczogRWJzVm9sdW1lQ29uZmlnW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWJzVm9sdW1lQ29uZmlnIHtcbiAgZGV2aWNlTmFtZTogc3RyaW5nO1xuICB2b2x1bWVUeXBlOiBzdHJpbmc7XG4gIHZvbHVtZVNpemVHQjogbnVtYmVyO1xuICBpb3BzPzogbnVtYmVyO1xuICB0aHJvdWdocHV0PzogbnVtYmVyO1xuICBkZWxldGVPblRlcm1pbmF0aW9uOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yIGltcGxlbWVudHMgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfVk9MVU1FX1NJWkVfR0IgPSA4O1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1ZPTFVNRV9UWVBFID0gJ2dwMyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PTlRITFlfSE9VUlMgPSA3MzA7XG5cbiAgc3VwcG9ydHMocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VUeXBlID09PSAnQVdTOjpFQzI6OkxhdW5jaFRlbXBsYXRlJztcbiAgfVxuXG4gIGFzeW5jIGNhbGN1bGF0ZUNvc3QoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmV4dHJhY3RDb25maWcocmVzb3VyY2UpO1xuXG4gICAgaWYgKCFjb25maWcuaW5zdGFuY2VUeXBlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICdMYXVuY2hUZW1wbGF0ZSBkb2VzIG5vdCBzcGVjaWZ5IGFuIGluc3RhbmNlIHR5cGUnLFxuICAgICAgICAgICdMYXVuY2hUZW1wbGF0ZXMgaGF2ZSBubyBkaXJlY3QgY29zdDsgY29zdHMgYXJlIGluY3VycmVkIHdoZW4gaW5zdGFuY2VzIGFyZSBsYXVuY2hlZCcsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvc3QgZm9yIGEgc2luZ2xlIGluc3RhbmNlIHVzaW5nIHRoaXMgdGVtcGxhdGVcbiAgICAgIGNvbnN0IGluc3RhbmNlQ29zdCA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlSW5zdGFuY2VDb3N0KFxuICAgICAgICBjb25maWcuaW5zdGFuY2VUeXBlLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIHByaWNpbmdDbGllbnQsXG4gICAgICApO1xuXG4gICAgICBpZiAoaW5zdGFuY2VDb3N0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgIGBQcmljaW5nIGRhdGEgbm90IGF2YWlsYWJsZSBmb3IgaW5zdGFuY2UgdHlwZSAke2NvbmZpZy5pbnN0YW5jZVR5cGV9IGluIHJlZ2lvbiAke3JlZ2lvbn1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JhZ2VDb3N0ID0gYXdhaXQgdGhpcy5jYWxjdWxhdGVTdG9yYWdlQ29zdChcbiAgICAgICAgY29uZmlnLmVic1ZvbHVtZXMsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgcHJpY2luZ0NsaWVudCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRvdGFsUGVySW5zdGFuY2VDb3N0ID0gaW5zdGFuY2VDb3N0ICsgc3RvcmFnZUNvc3Q7XG5cbiAgICAgIGNvbnN0IGFzc3VtcHRpb25zID0gW1xuICAgICAgICAnTGF1bmNoVGVtcGxhdGVzIGhhdmUgbm8gZGlyZWN0IGNvc3Q7IHRoaXMgcmVwcmVzZW50cyBwZXItaW5zdGFuY2UgY29zdCB3aGVuIHVzZWQnLFxuICAgICAgICBgSW5zdGFuY2UgdHlwZTogJHtjb25maWcuaW5zdGFuY2VUeXBlfWAsXG4gICAgICAgIGBBc3N1bWVzICR7TGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLk1PTlRITFlfSE9VUlN9IGhvdXJzIHBlciBtb250aCAoMjQvNyBvcGVyYXRpb24pYCxcbiAgICAgICAgJ0Fzc3VtZXMgTGludXggT1MsIHNoYXJlZCB0ZW5hbmN5LCBvbi1kZW1hbmQgcHJpY2luZycsXG4gICAgICBdO1xuXG4gICAgICBpZiAoY29uZmlnLmVic1ZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2b2x1bWVEZXNjcmlwdGlvbnMgPSBjb25maWcuZWJzVm9sdW1lcy5tYXAoXG4gICAgICAgICAgKHYpID0+IGAke3YuZGV2aWNlTmFtZX06ICR7di52b2x1bWVTaXplR0J9R0IgJHt2LnZvbHVtZVR5cGV9YCxcbiAgICAgICAgKTtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaChgRUJTIHZvbHVtZXM6ICR7dm9sdW1lRGVzY3JpcHRpb25zLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc1Byb3Zpc2lvbmVkSW9wcyA9IGNvbmZpZy5lYnNWb2x1bWVzLnNvbWUoXG4gICAgICAgICh2KSA9PiAodi52b2x1bWVUeXBlID09PSAnaW8xJyB8fCB2LnZvbHVtZVR5cGUgPT09ICdpbzInKSAmJiB2LmlvcHMsXG4gICAgICApO1xuICAgICAgaWYgKGhhc1Byb3Zpc2lvbmVkSW9wcykge1xuICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdQcm92aXNpb25lZCBJT1BTIGNvc3RzIGZvciBpbzEvaW8yIHZvbHVtZXMgYXJlIG5vdCBpbmNsdWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNUaHJvdWdocHV0ID0gY29uZmlnLmVic1ZvbHVtZXMuc29tZShcbiAgICAgICAgKHYpID0+IHYudm9sdW1lVHlwZSA9PT0gJ2dwMycgJiYgdi50aHJvdWdocHV0ICYmIHYudGhyb3VnaHB1dCA+IDEyNSxcbiAgICAgICk7XG4gICAgICBpZiAoaGFzVGhyb3VnaHB1dCkge1xuICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdBZGRpdGlvbmFsIHRocm91Z2hwdXQgY29zdHMgZm9yIGdwMyB2b2x1bWVzIGFyZSBub3QgaW5jbHVkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5pbWFnZUlkKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goYEFNSTogJHtjb25maWcuaW1hZ2VJZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbFBlckluc3RhbmNlQ29zdCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnbG93JyxcbiAgICAgICAgYXNzdW1wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgY29uZmlndXJhdGlvbiBmcm9tIGEgTGF1bmNoVGVtcGxhdGUgcmVzb3VyY2UuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHB1YmxpYyB0byBhbGxvdyBvdGhlciBjYWxjdWxhdG9ycyB0byB1c2UgaXQuXG4gICAqL1xuICBleHRyYWN0Q29uZmlnKHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCk6IExhdW5jaFRlbXBsYXRlQ29uZmlnIHtcbiAgICBjb25zdCBsYXVuY2hUZW1wbGF0ZURhdGEgPSByZXNvdXJjZS5wcm9wZXJ0aWVzLkxhdW5jaFRlbXBsYXRlRGF0YSBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWxhdW5jaFRlbXBsYXRlRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2VUeXBlOiBudWxsLFxuICAgICAgICBpbWFnZUlkOiBudWxsLFxuICAgICAgICBlYnNWb2x1bWVzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VUeXBlID0gKGxhdW5jaFRlbXBsYXRlRGF0YS5JbnN0YW5jZVR5cGUgYXMgc3RyaW5nKSB8fCBudWxsO1xuICAgIGNvbnN0IGltYWdlSWQgPSAobGF1bmNoVGVtcGxhdGVEYXRhLkltYWdlSWQgYXMgc3RyaW5nKSB8fCBudWxsO1xuICAgIGNvbnN0IGVic1ZvbHVtZXMgPSB0aGlzLmV4dHJhY3RFYnNWb2x1bWVzKGxhdW5jaFRlbXBsYXRlRGF0YSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFuY2VUeXBlLFxuICAgICAgaW1hZ2VJZCxcbiAgICAgIGVic1ZvbHVtZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEVic1ZvbHVtZXMoXG4gICAgbGF1bmNoVGVtcGxhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogRWJzVm9sdW1lQ29uZmlnW10ge1xuICAgIGNvbnN0IGJsb2NrRGV2aWNlTWFwcGluZ3MgPSBsYXVuY2hUZW1wbGF0ZURhdGEuQmxvY2tEZXZpY2VNYXBwaW5ncyBhc1xuICAgICAgfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFibG9ja0RldmljZU1hcHBpbmdzIHx8ICFBcnJheS5pc0FycmF5KGJsb2NrRGV2aWNlTWFwcGluZ3MpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2NrRGV2aWNlTWFwcGluZ3NcbiAgICAgIC5maWx0ZXIoKG1hcHBpbmcpID0+IG1hcHBpbmcuRWJzICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChtYXBwaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGVicyA9IG1hcHBpbmcuRWJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRldmljZU5hbWU6IChtYXBwaW5nLkRldmljZU5hbWUgYXMgc3RyaW5nKSB8fCAnL2Rldi94dmRhJyxcbiAgICAgICAgICB2b2x1bWVUeXBlOlxuICAgICAgICAgICAgKGVicy5Wb2x1bWVUeXBlIGFzIHN0cmluZykgfHxcbiAgICAgICAgICAgIExhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvci5ERUZBVUxUX1ZPTFVNRV9UWVBFLFxuICAgICAgICAgIHZvbHVtZVNpemVHQjpcbiAgICAgICAgICAgIChlYnMuVm9sdW1lU2l6ZSBhcyBudW1iZXIpIHx8XG4gICAgICAgICAgICBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IuREVGQVVMVF9WT0xVTUVfU0laRV9HQixcbiAgICAgICAgICBpb3BzOiBlYnMuSW9wcyBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgdGhyb3VnaHB1dDogZWJzLlRocm91Z2hwdXQgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGRlbGV0ZU9uVGVybWluYXRpb246IChlYnMuRGVsZXRlT25UZXJtaW5hdGlvbiBhcyBib29sZWFuKSA/PyB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZUluc3RhbmNlQ29zdChcbiAgICBpbnN0YW5jZVR5cGU6IHN0cmluZyxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGhvdXJseVJhdGUgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uRUMyJyxcbiAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHsgZmllbGQ6ICdpbnN0YW5jZVR5cGUnLCB2YWx1ZTogaW5zdGFuY2VUeXBlIH0sXG4gICAgICAgIHsgZmllbGQ6ICdvcGVyYXRpbmdTeXN0ZW0nLCB2YWx1ZTogJ0xpbnV4JyB9LFxuICAgICAgICB7IGZpZWxkOiAndGVuYW5jeScsIHZhbHVlOiAnU2hhcmVkJyB9LFxuICAgICAgICB7IGZpZWxkOiAncHJlSW5zdGFsbGVkU3cnLCB2YWx1ZTogJ05BJyB9LFxuICAgICAgICB7IGZpZWxkOiAnY2FwYWNpdHlzdGF0dXMnLCB2YWx1ZTogJ1VzZWQnIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKGhvdXJseVJhdGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBob3VybHlSYXRlICogTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLk1PTlRITFlfSE9VUlM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZVN0b3JhZ2VDb3N0KFxuICAgIGVic1ZvbHVtZXM6IEVic1ZvbHVtZUNvbmZpZ1tdLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKGVic1ZvbHVtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgdG90YWxTdG9yYWdlQ29zdCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHZvbHVtZSBvZiBlYnNWb2x1bWVzKSB7XG4gICAgICBjb25zdCBwcmljZVBlckdCTW9udGggPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25FQzInLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ1N0b3JhZ2UnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3ZvbHVtZUFwaU5hbWUnLCB2YWx1ZTogdm9sdW1lLnZvbHVtZVR5cGUudG9Mb3dlckNhc2UoKSB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcmljZVBlckdCTW9udGggIT09IG51bGwpIHtcbiAgICAgICAgdG90YWxTdG9yYWdlQ29zdCArPSBwcmljZVBlckdCTW9udGggKiB2b2x1bWUudm9sdW1lU2l6ZUdCO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b3RhbFN0b3JhZ2VDb3N0O1xuICB9XG5cbn1cbiJdfQ==
@@ -7,4 +7,5 @@ export { LambdaCalculator } from './calculators/LambdaCalculator';
7
7
  export { RDSCalculator } from './calculators/RDSCalculator';
8
8
  export { CloudFrontCalculator } from './calculators/CloudFrontCalculator';
9
9
  export { ElastiCacheCalculator } from './calculators/ElastiCacheCalculator';
10
+ export { LaunchTemplateCalculator, LaunchTemplateConfig, EbsVolumeConfig, } from './calculators/LaunchTemplateCalculator';
10
11
  export * from './types';
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
17
+ exports.LaunchTemplateCalculator = exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
18
18
  var PricingService_1 = require("./PricingService");
19
19
  Object.defineProperty(exports, "PricingService", { enumerable: true, get: function () { return PricingService_1.PricingService; } });
20
20
  var PricingClient_1 = require("./PricingClient");
@@ -33,5 +33,7 @@ var CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
33
33
  Object.defineProperty(exports, "CloudFrontCalculator", { enumerable: true, get: function () { return CloudFrontCalculator_1.CloudFrontCalculator; } });
34
34
  var ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
35
35
  Object.defineProperty(exports, "ElastiCacheCalculator", { enumerable: true, get: function () { return ElastiCacheCalculator_1.ElastiCacheCalculator; } });
36
+ var LaunchTemplateCalculator_1 = require("./calculators/LaunchTemplateCalculator");
37
+ Object.defineProperty(exports, "LaunchTemplateCalculator", { enumerable: true, get: function () { return LaunchTemplateCalculator_1.LaunchTemplateCalculator; } });
36
38
  __exportStar(require("./types"), exports);
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFByaWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi9QcmljaW5nU2VydmljZSc7XG5leHBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmV4cG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmV4cG9ydCB7IEVDMkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDMkNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUzNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TM0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5leHBvcnQgeyBFbGFzdGlDYWNoZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VsYXN0aUNhY2hlQ2FsY3VsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLG1GQUlnRDtBQUg5QyxvSUFBQSx3QkFBd0IsT0FBQTtBQUkxQiwwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4vUHJpY2luZ1NlcnZpY2UnO1xuZXhwb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5leHBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tICcuL0NhY2hlTWFuYWdlcic7XG5leHBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFMzQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUzNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuZXhwb3J0IHsgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FbGFzdGlDYWNoZUNhbGN1bGF0b3InO1xuZXhwb3J0IHtcbiAgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLFxuICBMYXVuY2hUZW1wbGF0ZUNvbmZpZyxcbiAgRWJzVm9sdW1lQ29uZmlnLFxufSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import { ResourceWithId, ResourceDiff } from '../diff/types';
2
2
  export interface PricingService {
3
- getResourceCost(resource: ResourceWithId, region: string): Promise<MonthlyCost>;
3
+ getResourceCost(resource: ResourceWithId, region: string, templateResources?: ResourceWithId[]): Promise<MonthlyCost>;
4
4
  getCostDelta(diff: ResourceDiff, region: string): Promise<CostDelta>;
5
5
  }
6
6
  export interface MonthlyCost {
@@ -29,7 +29,7 @@ export interface ModifiedResourceCost extends ResourceCost {
29
29
  export interface ResourceCostCalculator {
30
30
  supports(resourceType: string): boolean;
31
31
  canCalculate?(resource: ResourceWithId): boolean;
32
- calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
32
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient, templateResources?: ResourceWithId[]): Promise<MonthlyCost>;
33
33
  }
34
34
  export interface PricingClient {
35
35
  getPrice(params: PriceQueryParams): Promise<number | null>;
@@ -19,4 +19,4 @@ class UnsupportedResourceError extends Error {
19
19
  }
20
20
  }
21
21
  exports.UnsupportedResourceError = UnsupportedResourceError;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE0REEsTUFBYSxlQUFnQixTQUFRLEtBQUs7SUFDSjtJQUFwQyxZQUFZLE9BQWUsRUFBUyxZQUFxQixJQUFJO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURtQixjQUFTLEdBQVQsU0FBUyxDQUFnQjtRQUUzRCxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUxELDBDQUtDO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxLQUFLO0lBQzlCO0lBQW5CLFlBQW1CLFlBQW9CO1FBQ3JDLEtBQUssQ0FBQyxpQkFBaUIsWUFBWSxtQkFBbUIsQ0FBQyxDQUFDO1FBRHZDLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBRXJDLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBTEQsNERBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2luZ1NlcnZpY2Uge1xuICBnZXRSZXNvdXJjZUNvc3QocmVzb3VyY2U6IFJlc291cmNlV2l0aElkLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8TW9udGhseUNvc3Q+O1xuICBnZXRDb3N0RGVsdGEoZGlmZjogUmVzb3VyY2VEaWZmLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29zdERlbHRhPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aGx5Q29zdCB7XG4gIGFtb3VudDogbnVtYmVyO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBjb25maWRlbmNlOiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgJ3Vua25vd24nO1xuICBhc3N1bXB0aW9uczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29zdERlbHRhIHtcbiAgdG90YWxEZWx0YTogbnVtYmVyO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBhZGRlZENvc3RzOiBSZXNvdXJjZUNvc3RbXTtcbiAgcmVtb3ZlZENvc3RzOiBSZXNvdXJjZUNvc3RbXTtcbiAgbW9kaWZpZWRDb3N0czogTW9kaWZpZWRSZXNvdXJjZUNvc3RbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUNvc3Qge1xuICBsb2dpY2FsSWQ6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBtb250aGx5Q29zdDogTW9udGhseUNvc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZWRSZXNvdXJjZUNvc3QgZXh0ZW5kcyBSZXNvdXJjZUNvc3Qge1xuICBvbGRNb250aGx5Q29zdDogTW9udGhseUNvc3Q7XG4gIG5ld01vbnRobHlDb3N0OiBNb250aGx5Q29zdDtcbiAgY29zdERlbHRhOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIHN1cHBvcnRzKHJlc291cmNlVHlwZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgY2FuQ2FsY3VsYXRlPyhyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQpOiBib29sZWFuO1xuICBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50XG4gICk6IFByb21pc2U8TW9udGhseUNvc3Q+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaWNpbmdDbGllbnQge1xuICBnZXRQcmljZShwYXJhbXM6IFByaWNlUXVlcnlQYXJhbXMpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaWNlUXVlcnlQYXJhbXMge1xuICBzZXJ2aWNlQ29kZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgZmlsdGVyczogUHJpY2VGaWx0ZXJbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljZUZpbHRlciB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU/OiAnVEVSTV9NQVRDSCc7XG59XG5cbmV4cG9ydCBjbGFzcyBQcmljaW5nQVBJRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHJldHJ5YWJsZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUHJpY2luZ0FQSUVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRSZXNvdXJjZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVzb3VyY2VUeXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIHRoaXMubmFtZSA9ICdVbnN1cHBvcnRlZFJlc291cmNlRXJyb3InO1xuICB9XG59XG4iXX0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2REEsTUFBYSxlQUFnQixTQUFRLEtBQUs7SUFDSjtJQUFwQyxZQUFZLE9BQWUsRUFBUyxZQUFxQixJQUFJO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURtQixjQUFTLEdBQVQsU0FBUyxDQUFnQjtRQUUzRCxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUxELDBDQUtDO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxLQUFLO0lBQzlCO0lBQW5CLFlBQW1CLFlBQW9CO1FBQ3JDLEtBQUssQ0FBQyxpQkFBaUIsWUFBWSxtQkFBbUIsQ0FBQyxDQUFDO1FBRHZDLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBRXJDLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBTEQsNERBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2luZ1NlcnZpY2Uge1xuICBnZXRSZXNvdXJjZUNvc3QocmVzb3VyY2U6IFJlc291cmNlV2l0aElkLCByZWdpb246IHN0cmluZywgdGVtcGxhdGVSZXNvdXJjZXM/OiBSZXNvdXJjZVdpdGhJZFtdKTogUHJvbWlzZTxNb250aGx5Q29zdD47XG4gIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRobHlDb3N0IHtcbiAgYW1vdW50OiBudW1iZXI7XG4gIGN1cnJlbmN5OiBzdHJpbmc7XG4gIGNvbmZpZGVuY2U6ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCAndW5rbm93bic7XG4gIGFzc3VtcHRpb25zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3N0RGVsdGEge1xuICB0b3RhbERlbHRhOiBudW1iZXI7XG4gIGN1cnJlbmN5OiBzdHJpbmc7XG4gIGFkZGVkQ29zdHM6IFJlc291cmNlQ29zdFtdO1xuICByZW1vdmVkQ29zdHM6IFJlc291cmNlQ29zdFtdO1xuICBtb2RpZmllZENvc3RzOiBNb2RpZmllZFJlc291cmNlQ29zdFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQ29zdCB7XG4gIGxvZ2ljYWxJZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIG1vbnRobHlDb3N0OiBNb250aGx5Q29zdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmllZFJlc291cmNlQ29zdCBleHRlbmRzIFJlc291cmNlQ29zdCB7XG4gIG9sZE1vbnRobHlDb3N0OiBNb250aGx5Q29zdDtcbiAgbmV3TW9udGhseUNvc3Q6IE1vbnRobHlDb3N0O1xuICBjb3N0RGVsdGE6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yIHtcbiAgc3VwcG9ydHMocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBib29sZWFuO1xuICBjYW5DYWxjdWxhdGU/KHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCk6IGJvb2xlYW47XG4gIGNhbGN1bGF0ZUNvc3QoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICAgdGVtcGxhdGVSZXNvdXJjZXM/OiBSZXNvdXJjZVdpdGhJZFtdLFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nQ2xpZW50IHtcbiAgZ2V0UHJpY2UocGFyYW1zOiBQcmljZVF1ZXJ5UGFyYW1zKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljZVF1ZXJ5UGFyYW1zIHtcbiAgc2VydmljZUNvZGU6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGZpbHRlcnM6IFByaWNlRmlsdGVyW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2VGaWx0ZXIge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICB0eXBlPzogJ1RFUk1fTUFUQ0gnO1xufVxuXG5leHBvcnQgY2xhc3MgUHJpY2luZ0FQSUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyByZXRyeWFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1ByaWNpbmdBUElFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkUmVzb3VyY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlc291cmNlVHlwZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zdXBwb3J0ZWRSZXNvdXJjZUVycm9yJztcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- v0.1.20
1
+ v0.1.22
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "publishConfig": {
83
83
  "access": "public"
84
84
  },
85
- "version": "0.1.20",
85
+ "version": "0.1.22",
86
86
  "bugs": {
87
87
  "url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
88
88
  },