cdk-cost-analyzer 0.1.32 → 0.1.33

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": 1770972967203
5
+ "timestamp": 1770977254582
6
6
  },
7
7
  "AmazonDynamoDB:US East (N. Virginia):group:DDB-ReadUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
8
8
  "price": 0.023,
9
- "timestamp": 1770972967209
9
+ "timestamp": 1770977254588
10
10
  },
11
11
  "AmazonDynamoDB:US East (N. Virginia):group:DDB-WriteUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
12
12
  "price": 0.023,
13
- "timestamp": 1770972967210
13
+ "timestamp": 1770977254588
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": 1770972967219
17
+ "timestamp": 1770977254597
18
18
  },
19
19
  "AWSLambda:US East (N. Virginia):group:AWS-Lambda-Requests": {
20
20
  "price": 0.023,
21
- "timestamp": 1770972967229
21
+ "timestamp": 1770977254605
22
22
  },
23
23
  "AWSLambda:US East (N. Virginia):group:AWS-Lambda-Duration": {
24
24
  "price": 0.023,
25
- "timestamp": 1770972967229
25
+ "timestamp": 1770977254605
26
26
  },
27
27
  "AmazonS3:EU (Frankfurt):storageClass:General Purpose|volumeType:Standard": {
28
28
  "price": 0.023,
29
- "timestamp": 1770972974708
29
+ "timestamp": 1770977262339
30
30
  },
31
31
  "AmazonS3:invalid-region-123:storageClass:General Purpose|volumeType:Standard": {
32
32
  "price": 0.023,
33
- "timestamp": 1770972974758
33
+ "timestamp": 1770977262394
34
34
  }
35
35
  }
36
36
  }
@@ -62,6 +62,18 @@ export interface UsageAssumptionsConfig {
62
62
  vpcEndpoint?: {
63
63
  dataProcessedGB?: number;
64
64
  };
65
+ /**
66
+ * EFS (Elastic File System) usage assumptions for cost estimation.
67
+ * These values are used to estimate monthly costs for EFS file systems.
68
+ *
69
+ * @see https://aws.amazon.com/efs/pricing/
70
+ */
71
+ efs?: {
72
+ /** Total storage size in GB (default: 100) */
73
+ storageSizeGb?: number;
74
+ /** Percentage of storage in Infrequent Access class (default: 0, range: 0-100) */
75
+ infrequentAccessPercentage?: number;
76
+ };
65
77
  /**
66
78
  * SNS (Simple Notification Service) usage assumptions.
67
79
  * These values are used to estimate monthly costs for SNS topics.
@@ -106,6 +118,15 @@ export interface UsageAssumptionsConfig {
106
118
  /** Average execution duration in milliseconds (default: 1000, for Express workflows) */
107
119
  averageDurationMs?: number;
108
120
  };
121
+ /**
122
+ * Secrets Manager usage assumptions for cost estimation.
123
+ *
124
+ * @see https://aws.amazon.com/secrets-manager/pricing/
125
+ */
126
+ secretsManager?: {
127
+ /** Number of API calls per month (default: 10,000) */
128
+ monthlyApiCalls?: number;
129
+ };
109
130
  }
110
131
  export interface SynthesisConfig {
111
132
  appPath?: string;
@@ -12,4 +12,4 @@ class ConfigurationError extends Error {
12
12
  }
13
13
  }
14
14
  exports.ConfigurationError = ConfigurationError;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVJQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTTlMgKFNpbXBsZSBOb3RpZmljYXRpb24gU2VydmljZSkgdXNhZ2UgYXNzdW1wdGlvbnMuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBTTlMgdG9waWNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc25zL3ByaWNpbmcvXG4gICAqL1xuICBzbnM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBwdWJsaXNoIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBodHRwRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIGVtYWlsIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIGVtYWlsRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIFNNUyBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBzbXNEZWxpdmVyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgbW9iaWxlIHB1c2ggZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgbW9iaWxlUHVzaERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTUVMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICogQXBwbGllcyB0byBib3RoIFN0YW5kYXJkIGFuZCBGSUZPIHF1ZXVlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nxcy9wcmljaW5nL1xuICAgKi9cbiAgc3FzPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgbW9udGhseVJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU3RlcCBGdW5jdGlvbnMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogU3RhbmRhcmQgd29ya2Zsb3dzIGFyZSBjaGFyZ2VkIHBlciBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgKiBFeHByZXNzIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgcmVxdWVzdCBhbmQgcGVyIEdCLXNlY29uZCBvZiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL3ByaWNpbmcvXG4gICAqL1xuICBzdGVwRnVuY3Rpb25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2Ygd29ya2Zsb3cgZXhlY3V0aW9ucyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHN0YXRlIHRyYW5zaXRpb25zIHBlciBleGVjdXRpb24gKGRlZmF1bHQ6IDEwLCBmb3IgU3RhbmRhcmQgd29ya2Zsb3dzKSAqL1xuICAgIHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24/OiBudW1iZXI7XG4gICAgLyoqIEF2ZXJhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTAwMCwgZm9yIEV4cHJlc3Mgd29ya2Zsb3dzKSAqL1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpc0NvbmZpZyB7XG4gIGFwcFBhdGg/OiBzdHJpbmc7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIGN1c3RvbUNvbW1hbmQ/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2x1c2lvbnNDb25maWcge1xuICByZXNvdXJjZVR5cGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgZHVyYXRpb25Ib3Vycz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGVycm9yczogc3RyaW5nW107XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBjb25maWdQYXRoOiBzdHJpbmcsXG4gICAgcHVibGljIHZhbGlkYXRpb25FcnJvcnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29uZmlndXJhdGlvbkVycm9yJztcbiAgfVxufVxuIl19
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRKQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBFRlMgKEVsYXN0aWMgRmlsZSBTeXN0ZW0pIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBFRlMgZmlsZSBzeXN0ZW1zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vZWZzL3ByaWNpbmcvXG4gICAqL1xuICBlZnM/OiB7XG4gICAgLyoqIFRvdGFsIHN0b3JhZ2Ugc2l6ZSBpbiBHQiAoZGVmYXVsdDogMTAwKSAqL1xuICAgIHN0b3JhZ2VTaXplR2I/OiBudW1iZXI7XG4gICAgLyoqIFBlcmNlbnRhZ2Ugb2Ygc3RvcmFnZSBpbiBJbmZyZXF1ZW50IEFjY2VzcyBjbGFzcyAoZGVmYXVsdDogMCwgcmFuZ2U6IDAtMTAwKSAqL1xuICAgIGluZnJlcXVlbnRBY2Nlc3NQZXJjZW50YWdlPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU05TIChTaW1wbGUgTm90aWZpY2F0aW9uIFNlcnZpY2UpIHVzYWdlIGFzc3VtcHRpb25zLlxuICAgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gZXN0aW1hdGUgbW9udGhseSBjb3N0cyBmb3IgU05TIHRvcGljcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nucy9wcmljaW5nL1xuICAgKi9cbiAgc25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgcHVibGlzaCByZXF1ZXN0cyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBtb250aGx5UHVibGlzaGVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgSFRUUC9TIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgaHR0cERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBlbWFpbCBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBlbWFpbERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBTTVMgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgc21zRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIG1vYmlsZSBwdXNoIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIG1vYmlsZVB1c2hEZWxpdmVyaWVzPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU1FTIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqIEFwcGxpZXMgdG8gYm90aCBTdGFuZGFyZCBhbmQgRklGTyBxdWV1ZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zcXMvcHJpY2luZy9cbiAgICovXG4gIHNxcz86IHtcbiAgICAvKiogTnVtYmVyIG9mIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlSZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIFN0ZXAgRnVuY3Rpb25zIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIFN0YW5kYXJkIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgc3RhdGUgdHJhbnNpdGlvbi5cbiAgICogRXhwcmVzcyB3b3JrZmxvd3MgYXJlIGNoYXJnZWQgcGVyIHJlcXVlc3QgYW5kIHBlciBHQi1zZWNvbmQgb2YgZHVyYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zdGVwLWZ1bmN0aW9ucy9wcmljaW5nL1xuICAgKi9cbiAgc3RlcEZ1bmN0aW9ucz86IHtcbiAgICAvKiogTnVtYmVyIG9mIHdvcmtmbG93IGV4ZWN1dGlvbnMgcGVyIG1vbnRoIChkZWZhdWx0OiAxMCwwMDApICovXG4gICAgbW9udGhseUV4ZWN1dGlvbnM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBzdGF0ZSB0cmFuc2l0aW9ucyBwZXIgZXhlY3V0aW9uIChkZWZhdWx0OiAxMCwgZm9yIFN0YW5kYXJkIHdvcmtmbG93cykgKi9cbiAgICBzdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uPzogbnVtYmVyO1xuICAgIC8qKiBBdmVyYWdlIGV4ZWN1dGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDEwMDAsIGZvciBFeHByZXNzIHdvcmtmbG93cykgKi9cbiAgICBhdmVyYWdlRHVyYXRpb25Ncz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIFNlY3JldHMgTWFuYWdlciB1c2FnZSBhc3N1bXB0aW9ucyBmb3IgY29zdCBlc3RpbWF0aW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc2VjcmV0cy1tYW5hZ2VyL3ByaWNpbmcvXG4gICAqL1xuICBzZWNyZXRzTWFuYWdlcj86IHtcbiAgICAvKiogTnVtYmVyIG9mIEFQSSBjYWxscyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5QXBpQ2FsbHM/OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2lzQ29uZmlnIHtcbiAgYXBwUGF0aD86IHN0cmluZztcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgY3VzdG9tQ29tbWFuZD86IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjbHVzaW9uc0NvbmZpZyB7XG4gIHJlc291cmNlVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkdXJhdGlvbkhvdXJzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yczogc3RyaW5nW10sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdDb25maWd1cmF0aW9uRXJyb3InO1xuICB9XG59XG4iXX0=
@@ -9,6 +9,7 @@ const CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
9
9
  const DynamoDBCalculator_1 = require("./calculators/DynamoDBCalculator");
10
10
  const EC2Calculator_1 = require("./calculators/EC2Calculator");
11
11
  const ECSCalculator_1 = require("./calculators/ECSCalculator");
12
+ const EFSCalculator_1 = require("./calculators/EFSCalculator");
12
13
  const ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
13
14
  const LambdaCalculator_1 = require("./calculators/LambdaCalculator");
14
15
  const LaunchTemplateCalculator_1 = require("./calculators/LaunchTemplateCalculator");
@@ -16,6 +17,7 @@ const NatGatewayCalculator_1 = require("./calculators/NatGatewayCalculator");
16
17
  const NLBCalculator_1 = require("./calculators/NLBCalculator");
17
18
  const RDSCalculator_1 = require("./calculators/RDSCalculator");
18
19
  const S3Calculator_1 = require("./calculators/S3Calculator");
20
+ const SecretsManagerCalculator_1 = require("./calculators/SecretsManagerCalculator");
19
21
  const SNSCalculator_1 = require("./calculators/SNSCalculator");
20
22
  const SQSCalculator_1 = require("./calculators/SQSCalculator");
21
23
  const StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
@@ -58,9 +60,11 @@ class PricingService {
58
60
  new ElastiCacheCalculator_1.ElastiCacheCalculator(),
59
61
  new AutoScalingGroupCalculator_1.AutoScalingGroupCalculator(),
60
62
  new LaunchTemplateCalculator_1.LaunchTemplateCalculator(),
63
+ new EFSCalculator_1.EFSCalculator(usageAssumptions?.efs?.storageSizeGb, usageAssumptions?.efs?.infrequentAccessPercentage),
61
64
  new SNSCalculator_1.SNSCalculator(usageAssumptions?.sns?.monthlyPublishes, usageAssumptions?.sns?.httpDeliveries, usageAssumptions?.sns?.emailDeliveries, usageAssumptions?.sns?.smsDeliveries, usageAssumptions?.sns?.mobilePushDeliveries),
62
65
  new SQSCalculator_1.SQSCalculator(config),
63
66
  new StepFunctionsCalculator_1.StepFunctionsCalculator(usageAssumptions?.stepFunctions?.monthlyExecutions, usageAssumptions?.stepFunctions?.stateTransitionsPerExecution, usageAssumptions?.stepFunctions?.averageDurationMs),
67
+ new SecretsManagerCalculator_1.SecretsManagerCalculator(usageAssumptions?.secretsManager?.monthlyApiCalls),
64
68
  ];
65
69
  }
66
70
  async getResourceCost(resource, region, templateResources) {
@@ -174,4 +178,4 @@ class PricingService {
174
178
  }
175
179
  }
176
180
  exports.PricingService = PricingService;
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELG1GQUFnRjtBQUNoRiwrRUFBNEU7QUFDNUUsbURBQWdEO0FBVWhELE1BQWEsY0FBYztJQUNqQixXQUFXLENBQTJCO0lBQ3RDLGFBQWEsQ0FBZ0I7SUFDN0IscUJBQXFCLENBQWM7SUFFM0MsWUFDRSxTQUFpQixXQUFXLEVBQzVCLGdCQUF5QyxFQUN6QyxxQkFBZ0MsRUFDaEMsV0FBeUIsRUFDekIsYUFBNkI7UUFFN0Isa0RBQWtEO1FBQ2xELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixpREFBaUQ7WUFDakQsSUFBSSxZQUFzQyxDQUFDO1lBQzNDLElBQUksV0FBVyxFQUFFLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxhQUFhLEdBQUcsV0FBVyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFlBQVksR0FBRyxJQUFJLDJCQUFZLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMv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QUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVsRixNQUFNLFVBQVUsR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFFMUUsT0FBTztZQUNMLFVBQVU7WUFDVixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVU7WUFDVixZQUFZO1lBQ1osYUFBYTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUE1TUQsd0NBNE1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9DYWNoZU1hbmFnZXInO1xuaW1wb3J0IHsgQUxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQUxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBBUElHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQVBJR2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0F1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yJztcbmltcG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBEeW5hbW9EQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0R5bmFtb0RCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVDU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FbGFzdGlDYWNoZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBOYXRHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTmF0R2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTkxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTkxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFMzQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUzNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFNOU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1NOU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgU1FTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU1FTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgVlBDRW5kcG9pbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9WUENFbmRwb2ludENhbGN1bGF0b3InO1xuaW1wb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5pbXBvcnQge1xuICBQcmljaW5nU2VydmljZSBhcyBJUHJpY2luZ1NlcnZpY2UsXG4gIE1vbnRobHlDb3N0LFxuICBDb3N0RGVsdGEsXG4gIFJlc291cmNlQ29zdENhbGN1bGF0b3IsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcsIENvc3RBbmFseXplckNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQcmljaW5nU2VydmljZSBpbXBsZW1lbnRzIElQcmljaW5nU2VydmljZSB7XG4gIHByaXZhdGUgY2FsY3VsYXRvcnM6IFJlc291cmNlQ29zdENhbGN1bGF0b3JbXTtcbiAgcHJpdmF0ZSBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50O1xuICBwcml2YXRlIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlczogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVnaW9uOiBzdHJpbmcgPSAndXMtZWFzdC0xJyxcbiAgICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZyxcbiAgICBleGNsdWRlZFJlc291cmNlVHlwZXM/OiBzdHJpbmdbXSxcbiAgICBjYWNoZUNvbmZpZz86IENhY2hlQ29uZmlnLFxuICAgIHByaWNpbmdDbGllbnQ/OiBQcmljaW5nQ2xpZW50LFxuICApIHtcbiAgICAvLyBVc2UgcHJvdmlkZWQgcHJpY2luZyBjbGllbnQgb3IgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGlmIChwcmljaW5nQ2xpZW50KSB7XG4gICAgICB0aGlzLnByaWNpbmdDbGllbnQgPSBwcmljaW5nQ2xpZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbml0aWFsaXplIGNhY2hlIG1hbmFnZXIgaWYgY2FjaGluZyBpcyBlbmFibGVkXG4gICAgICBsZXQgY2FjaGVNYW5hZ2VyOiBDYWNoZU1hbmFnZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGVDb25maWc/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlRHVyYXRpb24gPSBjYWNoZUNvbmZpZz8uZHVyYXRpb25Ib3VycyA/PyAyNDtcbiAgICAgICAgY2FjaGVNYW5hZ2VyID0gbmV3IENhY2hlTWFuYWdlcignLmNkay1jb3N0LWFuYWx5emVyLWNhY2hlJywgY2FjaGVEdXJhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IG5ldyBQcmljaW5nQ2xpZW50KHJlZ2lvbiwgY2FjaGVNYW5hZ2VyKTtcbiAgICB9XG4gICAgdGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMgPSBuZXcgU2V0KGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyB8fCBbXSk7XG4gICAgXG4gICAgLy8gQnVpbGQgY29uZmlnIG9iamVjdCBmb3IgY2FsY3VsYXRvcnMgdGhhdCBuZWVkIGl0XG4gICAgY29uc3QgY29uZmlnOiBDb3N0QW5hbHl6ZXJDb25maWcgfCB1bmRlZmluZWQgPSB1c2FnZUFzc3VtcHRpb25zID8geyB1c2FnZUFzc3VtcHRpb25zIH0gOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgdGhpcy5jYWxjdWxhdG9ycyA9IFtcbiAgICAgIG5ldyBFQzJDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgUzNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGFtYmRhQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubGFtYmRhPy5pbnZvY2F0aW9uc1Blck1vbnRoLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/LmF2ZXJhZ2VEdXJhdGlvbk1zLFxuICAgICAgKSxcbiAgICAgIG5ldyBSRFNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgRHluYW1vREJDYWxjdWxhdG9yKGNvbmZpZyksXG4gICAgICBuZXcgRUNTQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEFQSUdhdGV3YXlDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTmF0R2F0ZXdheUNhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8ubmF0R2F0ZXdheT8uZGF0YVByb2Nlc3NlZEdCKSxcbiAgICAgIG5ldyBBTEJDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/Lm5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LmFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LnByb2Nlc3NlZEJ5dGVzR0IsXG4gICAgICApLFxuICAgICAgbmV3IE5MQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgVlBDRW5kcG9pbnRDYWxjdWxhdG9yKHVzYWdlQXNzdW1wdGlvbnM/LnZwY0VuZHBvaW50Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IENsb3VkRnJvbnRDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5kYXRhVHJhbnNmZXJHQixcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uY2xvdWRmcm9udD8ucmVxdWVzdHMsXG4gICAgICApLFxuICAgICAgbmV3IEVsYXN0aUNhY2hlQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgU05TQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5tb250aGx5UHVibGlzaGVzLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zbnM/Lmh0dHBEZWxpdmVyaWVzLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zbnM/LmVtYWlsRGVsaXZlcmllcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5zbXNEZWxpdmVyaWVzLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zbnM/Lm1vYmlsZVB1c2hEZWxpdmVyaWVzLFxuICAgICAgKSxcbiAgICAgIG5ldyBTUVNDYWxjdWxhdG9yKGNvbmZpZyksXG4gICAgICBuZXcgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnN0ZXBGdW5jdGlvbnM/Lm1vbnRobHlFeGVjdXRpb25zLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5zdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5hdmVyYWdlRHVyYXRpb25NcyxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nLCB0ZW1wbGF0ZVJlc291cmNlcz86IFJlc291cmNlV2l0aElkW10pOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2UgdHlwZSBpcyBleGNsdWRlZFxuICAgIGlmICh0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMocmVzb3VyY2UudHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBleGNsdWRlZCBmcm9tIGNvc3QgYW5hbHlzaXNgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjYWxjdWxhdG9yIHVzaW5nIGNhbkNhbGN1bGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc3VwcG9ydHNcbiAgICBjb25zdCBjYWxjdWxhdG9yID0gdGhpcy5jYWxjdWxhdG9ycy5maW5kKGNhbGMgPT4ge1xuICAgICAgaWYgKGNhbGMuY2FuQ2FsY3VsYXRlKSB7XG4gICAgICAgIHJldHVybiBjYWxjLmNhbkNhbGN1bGF0ZShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsYy5zdXBwb3J0cyhyZXNvdXJjZS50eXBlKTtcbiAgICB9KTtcblxuICAgIGlmICghY2FsY3VsYXRvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxjdWxhdG9yLmNhbGN1bGF0ZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgdGhpcy5wcmljaW5nQ2xpZW50LCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIC8vIEJ1aWxkIHRlbXBsYXRlIHJlc291cmNlIGNvbnRleHQgZnJvbSBhbGwgcmVzb3VyY2VzIGluIHRoZSBkaWZmXG4gICAgY29uc3QgYWxsUmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gW1xuICAgICAgLi4uZGlmZi5hZGRlZCxcbiAgICAgIC4uLmRpZmYucmVtb3ZlZCxcbiAgICAgIC4uLmRpZmYubW9kaWZpZWQubWFwKHIgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBwcm9wZXJ0aWVzOiByLm5ld1Byb3BlcnRpZXMsXG4gICAgICB9KSksXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUmVtb3ZlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkTW9kaWZpZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5vbGRQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5uZXdQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9sZE1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3Qob2xkUmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBjb3N0RGVsdGEgPSBuZXdNb250aGx5Q29zdC5hbW91bnQgLSBvbGRNb250aGx5Q29zdC5hbW91bnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0OiBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBvbGRNb250aGx5Q29zdCxcbiAgICAgICAgICBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBjb3N0RGVsdGEsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxBZGRlZENvc3QgPSBhZGRlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxSZW1vdmVkQ29zdCA9IHJlbW92ZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsTW9kaWZpZWREZWx0YSA9IG1vZGlmaWVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSB0b3RhbEFkZGVkQ29zdCAtIHRvdGFsUmVtb3ZlZENvc3QgKyB0b3RhbE1vZGlmaWVkRGVsdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkQ29zdHMsXG4gICAgICBtb2RpZmllZENvc3RzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnByaWNpbmdDbGllbnQuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtEQUE0RDtBQUM1RCwrRUFBNEU7QUFDNUUscUVBQWtFO0FBQ2xFLHFGQUFrRjtBQUNsRiw2RUFBMEU7QUFDMUUsK0RBQTREO0FBQzVELCtEQUE0RDtBQUM1RCw2REFBMEQ7QUFDMUQscUZBQWtGO0FBQ2xGLCtEQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQsbUZBQWdGO0FBQ2hGLCtFQUE0RTtBQUM1RSxtREFBZ0Q7QUFVaEQsTUFBYSxjQUFjO0lBQ2pCLFdBQVcsQ0FBMkI7SUFDdEMsYUFBYSxDQUFnQjtJQUM3QixxQkFBcUIsQ0FBYztJQUUzQyxZQUNFLFNBQWlCLFdBQVcsRUFDNUIsZ0JBQXlDLEVBQ3pDLHFCQUFnQyxFQUNoQyxXQUF5QixFQUN6QixhQUE2QjtRQUU3QixrREFBa0Q7UUFDbEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLGlEQUFpRDtZQUNqRCxJQUFJLFlBQXNDLENBQUM7WUFDM0MsSUFBSSxXQUFXLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxNQUFNLGFBQWEsR0FBRyxXQUFXLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztnQkFDdkQsWUFBWSxHQUFHLElBQUksMkJBQVksQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDZCQUFhLENBQUMsTUFB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TCxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7Z0JBQzdCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLGNBQWM7Z0JBQ2QsY0FBYztnQkFDZCxTQUFTO2FBQ1YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVsRixNQUFNLFVBQVUsR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFFMUUsT0FBTztZQUNMLFVBQVU7WUFDVixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVU7WUFDVixZQUFZO1lBQ1osYUFBYTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFuTkQsd0NBbU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9DYWNoZU1hbmFnZXInO1xuaW1wb3J0IHsgQUxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQUxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBBUElHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQVBJR2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0F1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yJztcbmltcG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBEeW5hbW9EQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0R5bmFtb0RCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVDU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgRUZTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUZTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFbGFzdGlDYWNoZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VsYXN0aUNhY2hlQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBMYW1iZGFDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYW1iZGFDYWxjdWxhdG9yJztcbmltcG9ydCB7IExhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yJztcbmltcG9ydCB7IE5hdEdhdGV3YXlDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9OYXRHYXRld2F5Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBOTEJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9OTEJDYWxjdWxhdG9yJztcbmltcG9ydCB7IFJEU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1JEU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgUzNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TM0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TZWNyZXRzTWFuYWdlckNhbGN1bGF0b3InO1xuaW1wb3J0IHsgU05TQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU05TQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTUVNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TUVNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFN0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TdGVwRnVuY3Rpb25zQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBWUENFbmRwb2ludENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1ZQQ0VuZHBvaW50Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmltcG9ydCB7XG4gIFByaWNpbmdTZXJ2aWNlIGFzIElQcmljaW5nU2VydmljZSxcbiAgTW9udGhseUNvc3QsXG4gIENvc3REZWx0YSxcbiAgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLCBDYWNoZUNvbmZpZywgQ29zdEFuYWx5emVyQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IFJlc291cmNlV2l0aElkLCBSZXNvdXJjZURpZmYgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByaWNpbmdTZXJ2aWNlIGltcGxlbWVudHMgSVByaWNpbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWxjdWxhdG9yczogUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcltdO1xuICBwcml2YXRlIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQ7XG4gIHByaXZhdGUgZXhjbHVkZWRSZXNvdXJjZVR5cGVzOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWdpb246IHN0cmluZyA9ICd1cy1lYXN0LTEnLFxuICAgIHVzYWdlQXNzdW1wdGlvbnM/OiBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLFxuICAgIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdLFxuICAgIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWcsXG4gICAgcHJpY2luZ0NsaWVudD86IFByaWNpbmdDbGllbnQsXG4gICkge1xuICAgIC8vIFVzZSBwcm92aWRlZCBwcmljaW5nIGNsaWVudCBvciBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKHByaWNpbmdDbGllbnQpIHtcbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IHByaWNpbmdDbGllbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRpYWxpemUgY2FjaGUgbWFuYWdlciBpZiBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICAgIGxldCBjYWNoZU1hbmFnZXI6IENhY2hlTWFuYWdlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZUNvbmZpZz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY2FjaGVEdXJhdGlvbiA9IGNhY2hlQ29uZmlnPy5kdXJhdGlvbkhvdXJzID8/IDI0O1xuICAgICAgICBjYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKCcuY2RrLWNvc3QtYW5hbHl6ZXItY2FjaGUnLCBjYWNoZUR1cmF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmljaW5nQ2xpZW50ID0gbmV3IFByaWNpbmdDbGllbnQocmVnaW9uLCBjYWNoZU1hbmFnZXIpO1xuICAgIH1cbiAgICB0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyA9IG5ldyBTZXQoZXhjbHVkZWRSZXNvdXJjZVR5cGVzIHx8IFtdKTtcbiAgICBcbiAgICAvLyBCdWlsZCBjb25maWcgb2JqZWN0IGZvciBjYWxjdWxhdG9ycyB0aGF0IG5lZWQgaXRcbiAgICBjb25zdCBjb25maWc6IENvc3RBbmFseXplckNvbmZpZyB8IHVuZGVmaW5lZCA9IHVzYWdlQXNzdW1wdGlvbnMgPyB7IHVzYWdlQXNzdW1wdGlvbnMgfSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICB0aGlzLmNhbGN1bGF0b3JzID0gW1xuICAgICAgbmV3IEVDMkNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBTM0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYW1iZGFDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/Lmludm9jYXRpb25zUGVyTW9udGgsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmxhbWJkYT8uYXZlcmFnZUR1cmF0aW9uTXMsXG4gICAgICApLFxuICAgICAgbmV3IFJEU0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBEeW5hbW9EQkNhbGN1bGF0b3IoY29uZmlnKSxcbiAgICAgIG5ldyBFQ1NDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQVBJR2F0ZXdheUNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBOYXRHYXRld2F5Q2FsY3VsYXRvcih1c2FnZUFzc3VtcHRpb25zPy5uYXRHYXRld2F5Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IEFMQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgTkxCQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5uZXdDb25uZWN0aW9uc1BlclNlY29uZCxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5hY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZSxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5wcm9jZXNzZWRCeXRlc0dCLFxuICAgICAgKSxcbiAgICAgIG5ldyBWUENFbmRwb2ludENhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8udnBjRW5kcG9pbnQ/LmRhdGFQcm9jZXNzZWRHQiksXG4gICAgICBuZXcgQ2xvdWRGcm9udENhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmNsb3VkZnJvbnQ/LmRhdGFUcmFuc2ZlckdCLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5yZXF1ZXN0cyxcbiAgICAgICksXG4gICAgICBuZXcgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBFRlNDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5lZnM/LnN0b3JhZ2VTaXplR2IsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmVmcz8uaW5mcmVxdWVudEFjY2Vzc1BlcmNlbnRhZ2UsXG4gICAgICApLFxuICAgICAgbmV3IFNOU0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnNucz8ubW9udGhseVB1Ymxpc2hlcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5odHRwRGVsaXZlcmllcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5lbWFpbERlbGl2ZXJpZXMsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnNucz8uc21zRGVsaXZlcmllcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5tb2JpbGVQdXNoRGVsaXZlcmllcyxcbiAgICAgICksXG4gICAgICBuZXcgU1FTQ2FsY3VsYXRvcihjb25maWcpLFxuICAgICAgbmV3IFN0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5tb250aGx5RXhlY3V0aW9ucyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc3RlcEZ1bmN0aW9ucz8uc3RhdGVUcmFuc2l0aW9uc1BlckV4ZWN1dGlvbixcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc3RlcEZ1bmN0aW9ucz8uYXZlcmFnZUR1cmF0aW9uTXMsXG4gICAgICApLFxuICAgICAgbmV3IFNlY3JldHNNYW5hZ2VyQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc2VjcmV0c01hbmFnZXI/Lm1vbnRobHlBcGlDYWxscyxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nLCB0ZW1wbGF0ZVJlc291cmNlcz86IFJlc291cmNlV2l0aElkW10pOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2UgdHlwZSBpcyBleGNsdWRlZFxuICAgIGlmICh0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMocmVzb3VyY2UudHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBleGNsdWRlZCBmcm9tIGNvc3QgYW5hbHlzaXNgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjYWxjdWxhdG9yIHVzaW5nIGNhbkNhbGN1bGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc3VwcG9ydHNcbiAgICBjb25zdCBjYWxjdWxhdG9yID0gdGhpcy5jYWxjdWxhdG9ycy5maW5kKGNhbGMgPT4ge1xuICAgICAgaWYgKGNhbGMuY2FuQ2FsY3VsYXRlKSB7XG4gICAgICAgIHJldHVybiBjYWxjLmNhbkNhbGN1bGF0ZShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsYy5zdXBwb3J0cyhyZXNvdXJjZS50eXBlKTtcbiAgICB9KTtcblxuICAgIGlmICghY2FsY3VsYXRvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxjdWxhdG9yLmNhbGN1bGF0ZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgdGhpcy5wcmljaW5nQ2xpZW50LCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIC8vIEJ1aWxkIHRlbXBsYXRlIHJlc291cmNlIGNvbnRleHQgZnJvbSBhbGwgcmVzb3VyY2VzIGluIHRoZSBkaWZmXG4gICAgY29uc3QgYWxsUmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gW1xuICAgICAgLi4uZGlmZi5hZGRlZCxcbiAgICAgIC4uLmRpZmYucmVtb3ZlZCxcbiAgICAgIC4uLmRpZmYubW9kaWZpZWQubWFwKHIgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBwcm9wZXJ0aWVzOiByLm5ld1Byb3BlcnRpZXMsXG4gICAgICB9KSksXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUmVtb3ZlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkTW9kaWZpZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5vbGRQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5uZXdQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9sZE1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3Qob2xkUmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBjb3N0RGVsdGEgPSBuZXdNb250aGx5Q29zdC5hbW91bnQgLSBvbGRNb250aGx5Q29zdC5hbW91bnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0OiBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBvbGRNb250aGx5Q29zdCxcbiAgICAgICAgICBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBjb3N0RGVsdGEsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxBZGRlZENvc3QgPSBhZGRlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxSZW1vdmVkQ29zdCA9IHJlbW92ZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsTW9kaWZpZWREZWx0YSA9IG1vZGlmaWVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSB0b3RhbEFkZGVkQ29zdCAtIHRvdGFsUmVtb3ZlZENvc3QgKyB0b3RhbE1vZGlmaWVkRGVsdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkQ29zdHMsXG4gICAgICBtb2RpZmllZENvc3RzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnByaWNpbmdDbGllbnQuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
3
+ export interface EFSUsageAssumptions {
4
+ storageSizeGb?: number;
5
+ infrequentAccessPercentage?: number;
6
+ }
7
+ export declare class EFSCalculator implements ResourceCostCalculator {
8
+ private readonly customStorageSizeGb?;
9
+ private readonly customInfrequentAccessPercentage?;
10
+ private readonly DEFAULT_STORAGE_SIZE_GB;
11
+ private readonly DEFAULT_IA_PERCENTAGE;
12
+ private readonly FALLBACK_STANDARD_PRICE;
13
+ private readonly FALLBACK_IA_STORAGE_PRICE;
14
+ private readonly FALLBACK_IA_REQUEST_PRICE;
15
+ private readonly FALLBACK_PROVISIONED_THROUGHPUT_PRICE;
16
+ constructor(customStorageSizeGb?: number | undefined, customInfrequentAccessPercentage?: number | undefined);
17
+ supports(resourceType: string): boolean;
18
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
19
+ }
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EFSCalculator = void 0;
4
+ const RegionMapper_1 = require("../RegionMapper");
5
+ const Logger_1 = require("../../utils/Logger");
6
+ class EFSCalculator {
7
+ customStorageSizeGb;
8
+ customInfrequentAccessPercentage;
9
+ DEFAULT_STORAGE_SIZE_GB = 100;
10
+ DEFAULT_IA_PERCENTAGE = 0;
11
+ // Fallback pricing rates (AWS EFS us-east-1 pricing as of 2024)
12
+ FALLBACK_STANDARD_PRICE = 0.30; // Per GB-month
13
+ FALLBACK_IA_STORAGE_PRICE = 0.016; // Per GB-month
14
+ FALLBACK_IA_REQUEST_PRICE = 0.01; // Per GB transferred
15
+ FALLBACK_PROVISIONED_THROUGHPUT_PRICE = 6.00; // Per MB/s-month
16
+ constructor(customStorageSizeGb, customInfrequentAccessPercentage) {
17
+ this.customStorageSizeGb = customStorageSizeGb;
18
+ this.customInfrequentAccessPercentage = customInfrequentAccessPercentage;
19
+ }
20
+ supports(resourceType) {
21
+ return resourceType === 'AWS::EFS::FileSystem';
22
+ }
23
+ async calculateCost(resource, region, pricingClient) {
24
+ try {
25
+ // Guard against undefined properties
26
+ if (!resource.properties) {
27
+ return {
28
+ amount: 0,
29
+ currency: 'USD',
30
+ confidence: 'unknown',
31
+ assumptions: ['Resource properties are undefined'],
32
+ };
33
+ }
34
+ const regionPrefix = (0, RegionMapper_1.getRegionPrefix)(region);
35
+ const storageSizeGb = this.customStorageSizeGb ?? this.DEFAULT_STORAGE_SIZE_GB;
36
+ const iaPercentage = this.customInfrequentAccessPercentage ?? this.DEFAULT_IA_PERCENTAGE;
37
+ Logger_1.Logger.debug('EFS pricing calculation started', {
38
+ region,
39
+ regionPrefix,
40
+ normalizedRegion: (0, RegionMapper_1.normalizeRegion)(region),
41
+ storageSizeGb,
42
+ iaPercentage,
43
+ });
44
+ // Check for lifecycle policies to determine if IA storage is used
45
+ const lifecyclePolicies = resource.properties?.LifecyclePolicies;
46
+ const hasIATransition = lifecyclePolicies?.some(policy => policy.TransitionToIA !== undefined) ?? false;
47
+ // Check for provisioned throughput
48
+ const throughputMode = resource.properties?.ThroughputMode;
49
+ const provisionedThroughputInMibps = resource.properties?.ProvisionedThroughputInMibps;
50
+ const isProvisionedThroughput = throughputMode === 'provisioned' && provisionedThroughputInMibps !== undefined;
51
+ // Calculate storage distribution
52
+ const effectiveIAPercentage = hasIATransition ? iaPercentage : 0;
53
+ const standardStorageGb = storageSizeGb * (1 - effectiveIAPercentage / 100);
54
+ const iaStorageGb = storageSizeGb * (effectiveIAPercentage / 100);
55
+ // Get Standard storage pricing
56
+ const standardStoragePrice = await pricingClient.getPrice({
57
+ serviceCode: 'AmazonEFS',
58
+ region: (0, RegionMapper_1.normalizeRegion)(region),
59
+ filters: [
60
+ { field: 'productFamily', value: 'Storage' },
61
+ { field: 'usagetype', value: `${regionPrefix}-TimedStorage-ByteHrs` },
62
+ ],
63
+ });
64
+ Logger_1.Logger.debug('EFS Standard storage price retrieved', {
65
+ standardStoragePrice,
66
+ usageType: `${regionPrefix}-TimedStorage-ByteHrs`,
67
+ });
68
+ // Get Infrequent Access storage pricing
69
+ let iaStoragePrice = null;
70
+ let iaRequestPrice = null;
71
+ if (hasIATransition && iaPercentage > 0) {
72
+ iaStoragePrice = await pricingClient.getPrice({
73
+ serviceCode: 'AmazonEFS',
74
+ region: (0, RegionMapper_1.normalizeRegion)(region),
75
+ filters: [
76
+ { field: 'productFamily', value: 'Storage' },
77
+ { field: 'usagetype', value: `${regionPrefix}-IATimedStorage-ByteHrs` },
78
+ ],
79
+ });
80
+ iaRequestPrice = await pricingClient.getPrice({
81
+ serviceCode: 'AmazonEFS',
82
+ region: (0, RegionMapper_1.normalizeRegion)(region),
83
+ filters: [
84
+ { field: 'productFamily', value: 'Storage' },
85
+ { field: 'usagetype', value: `${regionPrefix}-IARequests-Bytes` },
86
+ ],
87
+ });
88
+ Logger_1.Logger.debug('EFS IA storage prices retrieved', {
89
+ iaStoragePrice,
90
+ iaRequestPrice,
91
+ });
92
+ }
93
+ // Get Provisioned Throughput pricing
94
+ let provisionedThroughputPrice = null;
95
+ if (isProvisionedThroughput) {
96
+ provisionedThroughputPrice = await pricingClient.getPrice({
97
+ serviceCode: 'AmazonEFS',
98
+ region: (0, RegionMapper_1.normalizeRegion)(region),
99
+ filters: [
100
+ { field: 'productFamily', value: 'Provisioned Throughput' },
101
+ { field: 'usagetype', value: `${regionPrefix}-ProvisionedTP-MiBpsHrs` },
102
+ ],
103
+ });
104
+ Logger_1.Logger.debug('EFS Provisioned Throughput price retrieved', {
105
+ provisionedThroughputPrice,
106
+ usageType: `${regionPrefix}-ProvisionedTP-MiBpsHrs`,
107
+ });
108
+ }
109
+ const assumptions = [];
110
+ let totalCost = 0;
111
+ let confidence = 'medium';
112
+ // Calculate standard storage cost
113
+ const effectiveStandardPrice = standardStoragePrice ?? this.FALLBACK_STANDARD_PRICE;
114
+ const standardStorageCost = standardStorageGb * effectiveStandardPrice;
115
+ if (standardStoragePrice === null) {
116
+ assumptions.push('Using fallback Standard storage pricing (API unavailable)');
117
+ confidence = 'low';
118
+ }
119
+ totalCost += standardStorageCost;
120
+ assumptions.push(`Standard storage: ${standardStorageGb.toFixed(2)} GB × $${effectiveStandardPrice.toFixed(4)}/GB = $${standardStorageCost.toFixed(2)}/month`);
121
+ // Calculate IA storage cost
122
+ if (hasIATransition && iaPercentage > 0) {
123
+ const effectiveIAStoragePrice = iaStoragePrice ?? this.FALLBACK_IA_STORAGE_PRICE;
124
+ const iaStorageCost = iaStorageGb * effectiveIAStoragePrice;
125
+ if (iaStoragePrice === null) {
126
+ assumptions.push('Using fallback Infrequent Access storage pricing (API unavailable)');
127
+ confidence = 'low';
128
+ }
129
+ totalCost += iaStorageCost;
130
+ assumptions.push(`Infrequent Access storage: ${iaStorageGb.toFixed(2)} GB × $${effectiveIAStoragePrice.toFixed(4)}/GB = $${iaStorageCost.toFixed(2)}/month`);
131
+ // Estimate IA request cost (assume 10% of IA data is accessed per month)
132
+ const estimatedIAAccessGb = iaStorageGb * 0.10;
133
+ const effectiveIARequestPrice = iaRequestPrice ?? this.FALLBACK_IA_REQUEST_PRICE;
134
+ const iaRequestCost = estimatedIAAccessGb * effectiveIARequestPrice;
135
+ if (iaRequestPrice === null && iaPercentage > 0) {
136
+ assumptions.push('Using fallback Infrequent Access request pricing (API unavailable)');
137
+ confidence = 'low';
138
+ }
139
+ totalCost += iaRequestCost;
140
+ assumptions.push(`IA requests (estimated 10% access): ${estimatedIAAccessGb.toFixed(2)} GB × $${effectiveIARequestPrice.toFixed(4)}/GB = $${iaRequestCost.toFixed(2)}/month`);
141
+ }
142
+ // Calculate provisioned throughput cost
143
+ if (isProvisionedThroughput && provisionedThroughputInMibps !== undefined) {
144
+ const effectiveProvisionedPrice = provisionedThroughputPrice ?? this.FALLBACK_PROVISIONED_THROUGHPUT_PRICE;
145
+ const provisionedCost = provisionedThroughputInMibps * effectiveProvisionedPrice;
146
+ if (provisionedThroughputPrice === null) {
147
+ assumptions.push('Using fallback Provisioned Throughput pricing (API unavailable)');
148
+ confidence = 'low';
149
+ }
150
+ totalCost += provisionedCost;
151
+ assumptions.push(`Provisioned Throughput: ${provisionedThroughputInMibps} MB/s × $${effectiveProvisionedPrice.toFixed(2)}/MB/s = $${provisionedCost.toFixed(2)}/month`);
152
+ }
153
+ // Add summary assumptions
154
+ assumptions.push(`Total storage: ${storageSizeGb} GB`);
155
+ if (this.customStorageSizeGb !== undefined) {
156
+ assumptions.push('Using custom storage size assumption from configuration');
157
+ }
158
+ if (hasIATransition) {
159
+ assumptions.push(`Lifecycle policy detected: ${effectiveIAPercentage}% in Infrequent Access`);
160
+ if (this.customInfrequentAccessPercentage !== undefined) {
161
+ assumptions.push('Using custom IA percentage assumption from configuration');
162
+ }
163
+ }
164
+ if (throughputMode) {
165
+ assumptions.push(`Throughput mode: ${throughputMode}`);
166
+ }
167
+ assumptions.push(`Total: $${totalCost.toFixed(2)}/month`);
168
+ Logger_1.Logger.debug('EFS cost calculated', {
169
+ standardStorageCost,
170
+ totalCost,
171
+ confidence,
172
+ });
173
+ return {
174
+ amount: totalCost,
175
+ currency: 'USD',
176
+ confidence,
177
+ assumptions,
178
+ };
179
+ }
180
+ catch (error) {
181
+ Logger_1.Logger.debug('EFS pricing calculation failed', {
182
+ error: error instanceof Error ? error.message : String(error),
183
+ region,
184
+ });
185
+ return {
186
+ amount: 0,
187
+ currency: 'USD',
188
+ confidence: 'unknown',
189
+ assumptions: [`Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`],
190
+ };
191
+ }
192
+ }
193
+ }
194
+ exports.EFSCalculator = EFSCalculator;
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUZTQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0VGU0NhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQW1FO0FBQ25FLCtDQUE0QztBQU81QyxNQUFhLGFBQWE7SUFXTDtJQUNBO0lBWEYsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0lBQzlCLHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUUzQyxnRUFBZ0U7SUFDL0MsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZTtJQUMvQyx5QkFBeUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxlQUFlO0lBQ2xELHlCQUF5QixHQUFHLElBQUksQ0FBQyxDQUFDLHFCQUFxQjtJQUN2RCxxQ0FBcUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxpQkFBaUI7SUFFaEYsWUFDbUIsbUJBQTRCLEVBQzVCLGdDQUF5QztRQUR6Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVM7UUFDNUIscUNBQWdDLEdBQWhDLGdDQUFnQyxDQUFTO0lBQ3pELENBQUM7SUFFSixRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssc0JBQXNCLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQ2pCLFFBQXdCLEVBQ3hCLE1BQWMsRUFDZCxhQUE0QjtRQUU1QixJQUFJLENBQUM7WUFDSCxxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekIsT0FBTztvQkFDTCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxRQUFRLEVBQUUsS0FBSztvQkFDZixVQUFVLEVBQUUsU0FBUztvQkFDckIsV0FBVyxFQUFFLENBQUMsbUNBQW1DLENBQUM7aUJBQ25ELENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBQSw4QkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdD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QyxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ3BHLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdE5ELHNDQXNOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiwgZ2V0UmVnaW9uUHJlZml4IH0gZnJvbSAnLi4vUmVnaW9uTWFwcGVyJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL0xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRUZTVXNhZ2VBc3N1bXB0aW9ucyB7XG4gIHN0b3JhZ2VTaXplR2I/OiBudW1iZXI7XG4gIGluZnJlcXVlbnRBY2Nlc3NQZXJjZW50YWdlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRUZTQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfU1RPUkFHRV9TSVpFX0dCID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfSUFfUEVSQ0VOVEFHRSA9IDA7XG4gIFxuICAvLyBGYWxsYmFjayBwcmljaW5nIHJhdGVzIChBV1MgRUZTIHVzLWVhc3QtMSBwcmljaW5nIGFzIG9mIDIwMjQpXG4gIHByaXZhdGUgcmVhZG9ubHkgRkFMTEJBQ0tfU1RBTkRBUkRfUFJJQ0UgPSAwLjMwOyAvLyBQZXIgR0ItbW9udGhcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19JQV9TVE9SQUdFX1BSSUNFID0gMC4wMTY7IC8vIFBlciBHQi1tb250aFxuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX0lBX1JFUVVFU1RfUFJJQ0UgPSAwLjAxOyAvLyBQZXIgR0IgdHJhbnNmZXJyZWRcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19QUk9WSVNJT05FRF9USFJPVUdIUFVUX1BSSUNFID0gNi4wMDsgLy8gUGVyIE1CL3MtbW9udGhcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbVN0b3JhZ2VTaXplR2I/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21JbmZyZXF1ZW50QWNjZXNzUGVyY2VudGFnZT86IG51bWJlcixcbiAgKSB7fVxuXG4gIHN1cHBvcnRzKHJlc291cmNlVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc291cmNlVHlwZSA9PT0gJ0FXUzo6RUZTOjpGaWxlU3lzdGVtJztcbiAgfVxuXG4gIGFzeW5jIGNhbGN1bGF0ZUNvc3QoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgcHJvcGVydGllc1xuICAgICAgaWYgKCFyZXNvdXJjZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFsnUmVzb3VyY2UgcHJvcGVydGllcyBhcmUgdW5kZWZpbmVkJ10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZ2lvblByZWZpeCA9IGdldFJlZ2lvblByZWZpeChyZWdpb24pO1xuICAgICAgY29uc3Qgc3RvcmFnZVNpemVHYiA9IHRoaXMuY3VzdG9tU3RvcmFnZVNpemVHYiA/PyB0aGlzLkRFRkFVTFRfU1RPUkFHRV9TSVpFX0dCO1xuICAgICAgY29uc3QgaWFQZXJjZW50YWdlID0gdGhpcy5jdXN0b21JbmZyZXF1ZW50QWNjZXNzUGVyY2VudGFnZSA/PyB0aGlzLkRFRkFVTFRfSUFfUEVSQ0VOVEFHRTtcblxuICAgICAgTG9nZ2VyLmRlYnVnKCdFRlMgcHJpY2luZyBjYWxjdWxhdGlvbiBzdGFydGVkJywge1xuICAgICAgICByZWdpb24sXG4gICAgICAgIHJlZ2lvblByZWZpeCxcbiAgICAgICAgbm9ybWFsaXplZFJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIHN0b3JhZ2VTaXplR2IsXG4gICAgICAgIGlhUGVyY2VudGFnZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBmb3IgbGlmZWN5Y2xlIHBvbGljaWVzIHRvIGRldGVybWluZSBpZiBJQSBzdG9yYWdlIGlzIHVzZWRcbiAgICAgIGNvbnN0IGxpZmVjeWNsZVBvbGljaWVzID0gcmVzb3VyY2UucHJvcGVydGllcz8uTGlmZWN5Y2xlUG9saWNpZXMgYXMgQXJyYXk8eyBUcmFuc2l0aW9uVG9JQT86IHN0cmluZyB9PiB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0lBVHJhbnNpdGlvbiA9IGxpZmVjeWNsZVBvbGljaWVzPy5zb21lKHBvbGljeSA9PiBwb2xpY3kuVHJhbnNpdGlvblRvSUEgIT09IHVuZGVmaW5lZCkgPz8gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGZvciBwcm92aXNpb25lZCB0aHJvdWdocHV0XG4gICAgICBjb25zdCB0aHJvdWdocHV0TW9kZSA9IHJlc291cmNlLnByb3BlcnRpZXM/LlRocm91Z2hwdXRNb2RlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3Zpc2lvbmVkVGhyb3VnaHB1dEluTWlicHMgPSByZXNvdXJjZS5wcm9wZXJ0aWVzPy5Qcm92aXNpb25lZFRocm91Z2hwdXRJbk1pYnBzIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGlzUHJvdmlzaW9uZWRUaHJvdWdocHV0ID0gdGhyb3VnaHB1dE1vZGUgPT09ICdwcm92aXNpb25lZCcgJiYgcHJvdmlzaW9uZWRUaHJvdWdocHV0SW5NaWJwcyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgc3RvcmFnZSBkaXN0cmlidXRpb25cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUlBUGVyY2VudGFnZSA9IGhhc0lBVHJhbnNpdGlvbiA/IGlhUGVyY2VudGFnZSA6IDA7XG4gICAgICBjb25zdCBzdGFuZGFyZFN0b3JhZ2VHYiA9IHN0b3JhZ2VTaXplR2IgKiAoMSAtIGVmZmVjdGl2ZUlBUGVyY2VudGFnZSAvIDEwMCk7XG4gICAgICBjb25zdCBpYVN0b3JhZ2VHYiA9IHN0b3JhZ2VTaXplR2IgKiAoZWZmZWN0aXZlSUFQZXJjZW50YWdlIC8gMTAwKTtcblxuICAgICAgLy8gR2V0IFN0YW5kYXJkIHN0b3JhZ2UgcHJpY2luZ1xuICAgICAgY29uc3Qgc3RhbmRhcmRTdG9yYWdlUHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25FRlMnLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ1N0b3JhZ2UnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiBgJHtyZWdpb25QcmVmaXh9LVRpbWVkU3RvcmFnZS1CeXRlSHJzYCB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIExvZ2dlci5kZWJ1ZygnRUZTIFN0YW5kYXJkIHN0b3JhZ2UgcHJpY2UgcmV0cmlldmVkJywge1xuICAgICAgICBzdGFuZGFyZFN0b3JhZ2VQcmljZSxcbiAgICAgICAgdXNhZ2VUeXBlOiBgJHtyZWdpb25QcmVmaXh9LVRpbWVkU3RvcmFnZS1CeXRlSHJzYCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgSW5mcmVxdWVudCBBY2Nlc3Mgc3RvcmFnZSBwcmljaW5nXG4gICAgICBsZXQgaWFTdG9yYWdlUHJpY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGlhUmVxdWVzdFByaWNlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChoYXNJQVRyYW5zaXRpb24gJiYgaWFQZXJjZW50YWdlID4gMCkge1xuICAgICAgICBpYVN0b3JhZ2VQcmljZSA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uRUZTJyxcbiAgICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdTdG9yYWdlJyB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiBgJHtyZWdpb25QcmVmaXh9LUlBVGltZWRTdG9yYWdlLUJ5dGVIcnNgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWFSZXF1ZXN0UHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvbkVGUycsXG4gICAgICAgICAgcmVnaW9uOiBub3JtYWxpemVSZWdpb24ocmVnaW9uKSxcbiAgICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnU3RvcmFnZScgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogYCR7cmVnaW9uUHJlZml4fS1JQVJlcXVlc3RzLUJ5dGVzYCB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRUZTIElBIHN0b3JhZ2UgcHJpY2VzIHJldHJpZXZlZCcsIHtcbiAgICAgICAgICBpYVN0b3JhZ2VQcmljZSxcbiAgICAgICAgICBpYVJlcXVlc3RQcmljZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBQcm92aXNpb25lZCBUaHJvdWdocHV0IHByaWNpbmdcbiAgICAgIGxldCBwcm92aXNpb25lZFRocm91Z2hwdXRQcmljZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoaXNQcm92aXNpb25lZFRocm91Z2hwdXQpIHtcbiAgICAgICAgcHJvdmlzaW9uZWRUaHJvdWdocHV0UHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvbkVGUycsXG4gICAgICAgICAgcmVnaW9uOiBub3JtYWxpemVSZWdpb24ocmVnaW9uKSxcbiAgICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnUHJvdmlzaW9uZWQgVGhyb3VnaHB1dCcgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogYCR7cmVnaW9uUHJlZml4fS1Qcm92aXNpb25lZFRQLU1pQnBzSHJzYCB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRUZTIFByb3Zpc2lvbmVkIFRocm91Z2hwdXQgcHJpY2UgcmV0cmlldmVkJywge1xuICAgICAgICAgIHByb3Zpc2lvbmVkVGhyb3VnaHB1dFByaWNlLFxuICAgICAgICAgIHVzYWdlVHlwZTogYCR7cmVnaW9uUHJlZml4fS1Qcm92aXNpb25lZFRQLU1pQnBzSHJzYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFzc3VtcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHRvdGFsQ29zdCA9IDA7XG4gICAgICBsZXQgY29uZmlkZW5jZTogJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8ICd1bmtub3duJyA9ICdtZWRpdW0nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgc3RhbmRhcmQgc3RvcmFnZSBjb3N0XG4gICAgICBjb25zdCBlZmZlY3RpdmVTdGFuZGFyZFByaWNlID0gc3RhbmRhcmRTdG9yYWdlUHJpY2UgPz8gdGhpcy5GQUxMQkFDS19TVEFOREFSRF9QUklDRTtcbiAgICAgIGNvbnN0IHN0YW5kYXJkU3RvcmFnZUNvc3QgPSBzdGFuZGFyZFN0b3JhZ2VHYiAqIGVmZmVjdGl2ZVN0YW5kYXJkUHJpY2U7XG4gICAgICBpZiAoc3RhbmRhcmRTdG9yYWdlUHJpY2UgPT09IG51bGwpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgZmFsbGJhY2sgU3RhbmRhcmQgc3RvcmFnZSBwcmljaW5nIChBUEkgdW5hdmFpbGFibGUpJyk7XG4gICAgICAgIGNvbmZpZGVuY2UgPSAnbG93JztcbiAgICAgIH1cbiAgICAgIHRvdGFsQ29zdCArPSBzdGFuZGFyZFN0b3JhZ2VDb3N0O1xuICAgICAgYXNzdW1wdGlvbnMucHVzaChgU3RhbmRhcmQgc3RvcmFnZTogJHtzdGFuZGFyZFN0b3JhZ2VHYi50b0ZpeGVkKDIpfSBHQiDDlyAkJHtlZmZlY3RpdmVTdGFuZGFyZFByaWNlLnRvRml4ZWQoNCl9L0dCID0gJCR7c3RhbmRhcmRTdG9yYWdlQ29zdC50b0ZpeGVkKDIpfS9tb250aGApO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgSUEgc3RvcmFnZSBjb3N0XG4gICAgICBpZiAoaGFzSUFUcmFuc2l0aW9uICYmIGlhUGVyY2VudGFnZSA+IDApIHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSUFTdG9yYWdlUHJpY2UgPSBpYVN0b3JhZ2VQcmljZSA/PyB0aGlzLkZBTExCQUNLX0lBX1NUT1JBR0VfUFJJQ0U7XG4gICAgICAgIGNvbnN0IGlhU3RvcmFnZUNvc3QgPSBpYVN0b3JhZ2VHYiAqIGVmZmVjdGl2ZUlBU3RvcmFnZVByaWNlO1xuICAgICAgICBpZiAoaWFTdG9yYWdlUHJpY2UgPT09IG51bGwpIHtcbiAgICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdVc2luZyBmYWxsYmFjayBJbmZyZXF1ZW50IEFjY2VzcyBzdG9yYWdlIHByaWNpbmcgKEFQSSB1bmF2YWlsYWJsZSknKTtcbiAgICAgICAgICBjb25maWRlbmNlID0gJ2xvdyc7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWxDb3N0ICs9IGlhU3RvcmFnZUNvc3Q7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goYEluZnJlcXVlbnQgQWNjZXNzIHN0b3JhZ2U6ICR7aWFTdG9yYWdlR2IudG9GaXhlZCgyKX0gR0Igw5cgJCR7ZWZmZWN0aXZlSUFTdG9yYWdlUHJpY2UudG9GaXhlZCg0KX0vR0IgPSAkJHtpYVN0b3JhZ2VDb3N0LnRvRml4ZWQoMil9L21vbnRoYCk7XG5cbiAgICAgICAgLy8gRXN0aW1hdGUgSUEgcmVxdWVzdCBjb3N0IChhc3N1bWUgMTAlIG9mIElBIGRhdGEgaXMgYWNjZXNzZWQgcGVyIG1vbnRoKVxuICAgICAgICBjb25zdCBlc3RpbWF0ZWRJQUFjY2Vzc0diID0gaWFTdG9yYWdlR2IgKiAwLjEwO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJQVJlcXVlc3RQcmljZSA9IGlhUmVxdWVzdFByaWNlID8/IHRoaXMuRkFMTEJBQ0tfSUFfUkVRVUVTVF9QUklDRTtcbiAgICAgICAgY29uc3QgaWFSZXF1ZXN0Q29zdCA9IGVzdGltYXRlZElBQWNjZXNzR2IgKiBlZmZlY3RpdmVJQVJlcXVlc3RQcmljZTtcbiAgICAgICAgaWYgKGlhUmVxdWVzdFByaWNlID09PSBudWxsICYmIGlhUGVyY2VudGFnZSA+IDApIHtcbiAgICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdVc2luZyBmYWxsYmFjayBJbmZyZXF1ZW50IEFjY2VzcyByZXF1ZXN0IHByaWNpbmcgKEFQSSB1bmF2YWlsYWJsZSknKTtcbiAgICAgICAgICBjb25maWRlbmNlID0gJ2xvdyc7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWxDb3N0ICs9IGlhUmVxdWVzdENvc3Q7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goYElBIHJlcXVlc3RzIChlc3RpbWF0ZWQgMTAlIGFjY2Vzcyk6ICR7ZXN0aW1hdGVkSUFBY2Nlc3NHYi50b0ZpeGVkKDIpfSBHQiDDlyAkJHtlZmZlY3RpdmVJQVJlcXVlc3RQcmljZS50b0ZpeGVkKDQpfS9HQiA9ICQke2lhUmVxdWVzdENvc3QudG9GaXhlZCgyKX0vbW9udGhgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHByb3Zpc2lvbmVkIHRocm91Z2hwdXQgY29zdFxuICAgICAgaWYgKGlzUHJvdmlzaW9uZWRUaHJvdWdocHV0ICYmIHByb3Zpc2lvbmVkVGhyb3VnaHB1dEluTWlicHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVQcm92aXNpb25lZFByaWNlID0gcHJvdmlzaW9uZWRUaHJvdWdocHV0UHJpY2UgPz8gdGhpcy5GQUxMQkFDS19QUk9WSVNJT05FRF9USFJPVUdIUFVUX1BSSUNFO1xuICAgICAgICBjb25zdCBwcm92aXNpb25lZENvc3QgPSBwcm92aXNpb25lZFRocm91Z2hwdXRJbk1pYnBzICogZWZmZWN0aXZlUHJvdmlzaW9uZWRQcmljZTtcbiAgICAgICAgaWYgKHByb3Zpc2lvbmVkVGhyb3VnaHB1dFByaWNlID09PSBudWxsKSB7XG4gICAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgZmFsbGJhY2sgUHJvdmlzaW9uZWQgVGhyb3VnaHB1dCBwcmljaW5nIChBUEkgdW5hdmFpbGFibGUpJyk7XG4gICAgICAgICAgY29uZmlkZW5jZSA9ICdsb3cnO1xuICAgICAgICB9XG4gICAgICAgIHRvdGFsQ29zdCArPSBwcm92aXNpb25lZENvc3Q7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goYFByb3Zpc2lvbmVkIFRocm91Z2hwdXQ6ICR7cHJvdmlzaW9uZWRUaHJvdWdocHV0SW5NaWJwc30gTUIvcyDDlyAkJHtlZmZlY3RpdmVQcm92aXNpb25lZFByaWNlLnRvRml4ZWQoMil9L01CL3MgPSAkJHtwcm92aXNpb25lZENvc3QudG9GaXhlZCgyKX0vbW9udGhgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHN1bW1hcnkgYXNzdW1wdGlvbnNcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYFRvdGFsIHN0b3JhZ2U6ICR7c3RvcmFnZVNpemVHYn0gR0JgKTtcbiAgICAgIGlmICh0aGlzLmN1c3RvbVN0b3JhZ2VTaXplR2IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdVc2luZyBjdXN0b20gc3RvcmFnZSBzaXplIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzSUFUcmFuc2l0aW9uKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goYExpZmVjeWNsZSBwb2xpY3kgZGV0ZWN0ZWQ6ICR7ZWZmZWN0aXZlSUFQZXJjZW50YWdlfSUgaW4gSW5mcmVxdWVudCBBY2Nlc3NgKTtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tSW5mcmVxdWVudEFjY2Vzc1BlcmNlbnRhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBJQSBwZXJjZW50YWdlIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aHJvdWdocHV0TW9kZSkge1xuICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKGBUaHJvdWdocHV0IG1vZGU6ICR7dGhyb3VnaHB1dE1vZGV9YCk7XG4gICAgICB9XG5cbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYFRvdGFsOiAkJHt0b3RhbENvc3QudG9GaXhlZCgyKX0vbW9udGhgKTtcblxuICAgICAgTG9nZ2VyLmRlYnVnKCdFRlMgY29zdCBjYWxjdWxhdGVkJywge1xuICAgICAgICBzdGFuZGFyZFN0b3JhZ2VDb3N0LFxuICAgICAgICB0b3RhbENvc3QsXG4gICAgICAgIGNvbmZpZGVuY2UsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbENvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZSxcbiAgICAgICAgYXNzdW1wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBMb2dnZXIuZGVidWcoJ0VGUyBwcmljaW5nIGNhbGN1bGF0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBmZXRjaCBwcmljaW5nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
3
+ /**
4
+ * Calculator for AWS::SecretsManager::Secret resources.
5
+ *
6
+ * AWS Secrets Manager Pricing Model (as of 2024):
7
+ * - Secret storage: $0.40 per secret per month
8
+ * - API calls: $0.05 per 10,000 API calls
9
+ * - No free tier
10
+ *
11
+ * @see https://aws.amazon.com/secrets-manager/pricing/
12
+ */
13
+ export declare class SecretsManagerCalculator implements ResourceCostCalculator {
14
+ private readonly customMonthlyApiCalls?;
15
+ private readonly DEFAULT_MONTHLY_API_CALLS;
16
+ private readonly FALLBACK_SECRET_STORAGE_PRICE;
17
+ private readonly FALLBACK_API_CALL_PRICE_PER_10K;
18
+ constructor(customMonthlyApiCalls?: number | undefined);
19
+ supports(resourceType: string): boolean;
20
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
21
+ }
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecretsManagerCalculator = void 0;
4
+ const RegionMapper_1 = require("../RegionMapper");
5
+ const Logger_1 = require("../../utils/Logger");
6
+ /**
7
+ * Calculator for AWS::SecretsManager::Secret resources.
8
+ *
9
+ * AWS Secrets Manager Pricing Model (as of 2024):
10
+ * - Secret storage: $0.40 per secret per month
11
+ * - API calls: $0.05 per 10,000 API calls
12
+ * - No free tier
13
+ *
14
+ * @see https://aws.amazon.com/secrets-manager/pricing/
15
+ */
16
+ class SecretsManagerCalculator {
17
+ customMonthlyApiCalls;
18
+ // Default usage assumptions
19
+ DEFAULT_MONTHLY_API_CALLS = 10_000;
20
+ // Fallback pricing (AWS Secrets Manager pricing as of 2024)
21
+ FALLBACK_SECRET_STORAGE_PRICE = 0.40; // Per secret per month
22
+ FALLBACK_API_CALL_PRICE_PER_10K = 0.05;
23
+ constructor(customMonthlyApiCalls) {
24
+ this.customMonthlyApiCalls = customMonthlyApiCalls;
25
+ }
26
+ supports(resourceType) {
27
+ return resourceType === 'AWS::SecretsManager::Secret';
28
+ }
29
+ async calculateCost(resource, region, pricingClient) {
30
+ const monthlyApiCalls = this.customMonthlyApiCalls ?? this.DEFAULT_MONTHLY_API_CALLS;
31
+ Logger_1.Logger.debug('Secrets Manager pricing calculation started', {
32
+ region,
33
+ logicalId: resource.logicalId,
34
+ monthlyApiCalls,
35
+ });
36
+ try {
37
+ const normalizedRegion = (0, RegionMapper_1.normalizeRegion)(region);
38
+ // Query pricing for secret storage (per secret monthly cost)
39
+ const secretStoragePrice = await pricingClient.getPrice({
40
+ serviceCode: 'AWSSecretsManager',
41
+ region: normalizedRegion,
42
+ filters: [
43
+ { field: 'productFamily', value: 'Secret' },
44
+ { field: 'group', value: 'SecretStorage' },
45
+ ],
46
+ });
47
+ Logger_1.Logger.debug('Secrets Manager storage price retrieved', {
48
+ secretStoragePrice,
49
+ region: normalizedRegion,
50
+ });
51
+ // Query pricing for API calls
52
+ const apiCallPrice = await pricingClient.getPrice({
53
+ serviceCode: 'AWSSecretsManager',
54
+ region: normalizedRegion,
55
+ filters: [
56
+ { field: 'productFamily', value: 'Secret' },
57
+ { field: 'group', value: 'SecretRotation' },
58
+ ],
59
+ });
60
+ Logger_1.Logger.debug('Secrets Manager API call price retrieved', {
61
+ apiCallPrice,
62
+ region: normalizedRegion,
63
+ });
64
+ // If pricing data is completely unavailable
65
+ if (secretStoragePrice === null && apiCallPrice === null) {
66
+ Logger_1.Logger.debug('Secrets Manager pricing not available', {
67
+ region,
68
+ normalizedRegion,
69
+ });
70
+ return {
71
+ amount: 0,
72
+ currency: 'USD',
73
+ confidence: 'unknown',
74
+ assumptions: [
75
+ `Pricing data not available for Secrets Manager in region ${region}`,
76
+ `Would assume ${monthlyApiCalls.toLocaleString()} API calls per month`,
77
+ ],
78
+ };
79
+ }
80
+ // Handle pricing unavailability with fallback
81
+ const storageCost = secretStoragePrice ?? this.FALLBACK_SECRET_STORAGE_PRICE;
82
+ const callCostPer10K = apiCallPrice ?? this.FALLBACK_API_CALL_PRICE_PER_10K;
83
+ const apiCallCost = (monthlyApiCalls / 10_000) * callCostPer10K;
84
+ const totalCost = storageCost + apiCallCost;
85
+ const confidence = (secretStoragePrice === null || apiCallPrice === null) ? 'low' : 'medium';
86
+ const usedFallback = (secretStoragePrice === null || apiCallPrice === null);
87
+ Logger_1.Logger.debug('Secrets Manager cost calculated', {
88
+ storageCost,
89
+ callCostPer10K,
90
+ apiCallCost,
91
+ totalCost,
92
+ confidence,
93
+ usedFallback,
94
+ });
95
+ const assumptions = [];
96
+ // Add fallback warning first if used
97
+ if (usedFallback) {
98
+ if (secretStoragePrice === null) {
99
+ assumptions.push('Using fallback storage pricing (API unavailable)');
100
+ }
101
+ if (apiCallPrice === null) {
102
+ assumptions.push('Using fallback API call pricing (API unavailable)');
103
+ }
104
+ }
105
+ // Add cost breakdown
106
+ assumptions.push(`Secret storage: $${storageCost.toFixed(2)}/month`);
107
+ assumptions.push(`API calls: ${monthlyApiCalls.toLocaleString()} calls × $${callCostPer10K.toFixed(4)}/10K = $${apiCallCost.toFixed(2)}/month`);
108
+ assumptions.push(`Total: $${totalCost.toFixed(2)}/month`);
109
+ // Add custom assumption note
110
+ if (this.customMonthlyApiCalls !== undefined) {
111
+ assumptions.push('Using custom API call volume from configuration');
112
+ }
113
+ // Add informational notes
114
+ assumptions.push('No free tier for Secrets Manager');
115
+ assumptions.push('Cross-region replication incurs additional costs (not calculated)');
116
+ return {
117
+ amount: totalCost,
118
+ currency: 'USD',
119
+ confidence,
120
+ assumptions,
121
+ };
122
+ }
123
+ catch (error) {
124
+ Logger_1.Logger.debug('Secrets Manager pricing calculation failed', {
125
+ error: error instanceof Error ? error.message : String(error),
126
+ region,
127
+ });
128
+ return {
129
+ amount: 0,
130
+ currency: 'USD',
131
+ confidence: 'unknown',
132
+ assumptions: [`Failed to calculate Secrets Manager cost: ${error instanceof Error ? error.message : String(error)}`],
133
+ };
134
+ }
135
+ }
136
+ }
137
+ exports.SecretsManagerCalculator = SecretsManagerCalculator;
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjcmV0c01hbmFnZXJDYWxjdWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaWNpbmcvY2FsY3VsYXRvcnMvU2VjcmV0c01hbmFnZXJDYWxjdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGtEQUFrRDtBQUNsRCwrQ0FBNEM7QUFFNUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSx3QkFBd0I7SUFRTjtJQVA3Qiw0QkFBNEI7SUFDWCx5QkFBeUIsR0FBRyxNQUFNLENBQUM7SUFFcEQsNERBQTREO0lBQzNDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtJQUM3RCwrQkFBK0IsR0FBRyxJQUFJLENBQUM7SUFFeEQsWUFBNkIscUJBQThCO1FBQTlCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBUztJQUFHLENBQUM7SUFFL0QsUUFBUSxDQUFDLFlBQW9CO1FBQzNCLE9BQU8sWUFBWSxLQUFLLDZCQUE2QixDQUFDO0lBQ3hELENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUNqQixRQUF3QixFQUN4QixNQUFjLEVBQ2QsYUFBNEI7UUFFNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUVyRixlQUFNLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFO1lBQzFELE1BQU07WUFDTixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDN0IsZUFBZTtTQUNoQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUM7WUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsQ0FBQztZQUVqRCw2REFBNkQ7WUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELFdBQVcsRUFBRSxtQkFBbUI7Z0JBQ2hDLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE9BQU8sRUFBRTtv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QztDQUNGO0FBakpELDREQWlKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiB9IGZyb20gJy4uL1JlZ2lvbk1hcHBlcic7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9Mb2dnZXInO1xuXG4vKipcbiAqIENhbGN1bGF0b3IgZm9yIEFXUzo6U2VjcmV0c01hbmFnZXI6OlNlY3JldCByZXNvdXJjZXMuXG4gKlxuICogQVdTIFNlY3JldHMgTWFuYWdlciBQcmljaW5nIE1vZGVsIChhcyBvZiAyMDI0KTpcbiAqIC0gU2VjcmV0IHN0b3JhZ2U6ICQwLjQwIHBlciBzZWNyZXQgcGVyIG1vbnRoXG4gKiAtIEFQSSBjYWxsczogJDAuMDUgcGVyIDEwLDAwMCBBUEkgY2FsbHNcbiAqIC0gTm8gZnJlZSB0aWVyXG4gKlxuICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3NlY3JldHMtbWFuYWdlci9wcmljaW5nL1xuICovXG5leHBvcnQgY2xhc3MgU2VjcmV0c01hbmFnZXJDYWxjdWxhdG9yIGltcGxlbWVudHMgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIC8vIERlZmF1bHQgdXNhZ2UgYXNzdW1wdGlvbnNcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX01PTlRITFlfQVBJX0NBTExTID0gMTBfMDAwO1xuXG4gIC8vIEZhbGxiYWNrIHByaWNpbmcgKEFXUyBTZWNyZXRzIE1hbmFnZXIgcHJpY2luZyBhcyBvZiAyMDI0KVxuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX1NFQ1JFVF9TVE9SQUdFX1BSSUNFID0gMC40MDsgLy8gUGVyIHNlY3JldCBwZXIgbW9udGhcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19BUElfQ0FMTF9QUklDRV9QRVJfMTBLID0gMC4wNTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGN1c3RvbU1vbnRobHlBcGlDYWxscz86IG51bWJlcikge31cblxuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OlNlY3JldHNNYW5hZ2VyOjpTZWNyZXQnO1xuICB9XG5cbiAgYXN5bmMgY2FsY3VsYXRlQ29zdChcbiAgICByZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IG1vbnRobHlBcGlDYWxscyA9IHRoaXMuY3VzdG9tTW9udGhseUFwaUNhbGxzID8/IHRoaXMuREVGQVVMVF9NT05USExZX0FQSV9DQUxMUztcblxuICAgIExvZ2dlci5kZWJ1ZygnU2VjcmV0cyBNYW5hZ2VyIHByaWNpbmcgY2FsY3VsYXRpb24gc3RhcnRlZCcsIHtcbiAgICAgIHJlZ2lvbixcbiAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgbW9udGhseUFwaUNhbGxzLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWdpb24gPSBub3JtYWxpemVSZWdpb24ocmVnaW9uKTtcblxuICAgICAgLy8gUXVlcnkgcHJpY2luZyBmb3Igc2VjcmV0IHN0b3JhZ2UgKHBlciBzZWNyZXQgbW9udGhseSBjb3N0KVxuICAgICAgY29uc3Qgc2VjcmV0U3RvcmFnZVByaWNlID0gYXdhaXQgcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICAgIHNlcnZpY2VDb2RlOiAnQVdTU2VjcmV0c01hbmFnZXInLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnU2VjcmV0JyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdncm91cCcsIHZhbHVlOiAnU2VjcmV0U3RvcmFnZScgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBMb2dnZXIuZGVidWcoJ1NlY3JldHMgTWFuYWdlciBzdG9yYWdlIHByaWNlIHJldHJpZXZlZCcsIHtcbiAgICAgICAgc2VjcmV0U3RvcmFnZVByaWNlLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICB9KTtcblxuICAgICAgLy8gUXVlcnkgcHJpY2luZyBmb3IgQVBJIGNhbGxzXG4gICAgICBjb25zdCBhcGlDYWxsUHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBV1NTZWNyZXRzTWFuYWdlcicsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplZFJlZ2lvbixcbiAgICAgICAgZmlsdGVyczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdTZWNyZXQnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2dyb3VwJywgdmFsdWU6ICdTZWNyZXRSb3RhdGlvbicgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBMb2dnZXIuZGVidWcoJ1NlY3JldHMgTWFuYWdlciBBUEkgY2FsbCBwcmljZSByZXRyaWV2ZWQnLCB7XG4gICAgICAgIGFwaUNhbGxQcmljZSxcbiAgICAgICAgcmVnaW9uOiBub3JtYWxpemVkUmVnaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHByaWNpbmcgZGF0YSBpcyBjb21wbGV0ZWx5IHVuYXZhaWxhYmxlXG4gICAgICBpZiAoc2VjcmV0U3RvcmFnZVByaWNlID09PSBudWxsICYmIGFwaUNhbGxQcmljZSA9PT0gbnVsbCkge1xuICAgICAgICBMb2dnZXIuZGVidWcoJ1NlY3JldHMgTWFuYWdlciBwcmljaW5nIG5vdCBhdmFpbGFibGUnLCB7XG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgIGBQcmljaW5nIGRhdGEgbm90IGF2YWlsYWJsZSBmb3IgU2VjcmV0cyBNYW5hZ2VyIGluIHJlZ2lvbiAke3JlZ2lvbn1gLFxuICAgICAgICAgICAgYFdvdWxkIGFzc3VtZSAke21vbnRobHlBcGlDYWxscy50b0xvY2FsZVN0cmluZygpfSBBUEkgY2FsbHMgcGVyIG1vbnRoYCxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgcHJpY2luZyB1bmF2YWlsYWJpbGl0eSB3aXRoIGZhbGxiYWNrXG4gICAgICBjb25zdCBzdG9yYWdlQ29zdCA9IHNlY3JldFN0b3JhZ2VQcmljZSA/PyB0aGlzLkZBTExCQUNLX1NFQ1JFVF9TVE9SQUdFX1BSSUNFO1xuICAgICAgY29uc3QgY2FsbENvc3RQZXIxMEsgPSBhcGlDYWxsUHJpY2UgPz8gdGhpcy5GQUxMQkFDS19BUElfQ0FMTF9QUklDRV9QRVJfMTBLO1xuXG4gICAgICBjb25zdCBhcGlDYWxsQ29zdCA9IChtb250aGx5QXBpQ2FsbHMgLyAxMF8wMDApICogY2FsbENvc3RQZXIxMEs7XG4gICAgICBjb25zdCB0b3RhbENvc3QgPSBzdG9yYWdlQ29zdCArIGFwaUNhbGxDb3N0O1xuXG4gICAgICBjb25zdCBjb25maWRlbmNlID0gKHNlY3JldFN0b3JhZ2VQcmljZSA9PT0gbnVsbCB8fCBhcGlDYWxsUHJpY2UgPT09IG51bGwpID8gJ2xvdycgOiAnbWVkaXVtJztcbiAgICAgIGNvbnN0IHVzZWRGYWxsYmFjayA9IChzZWNyZXRTdG9yYWdlUHJpY2UgPT09IG51bGwgfHwgYXBpQ2FsbFByaWNlID09PSBudWxsKTtcblxuICAgICAgTG9nZ2VyLmRlYnVnKCdTZWNyZXRzIE1hbmFnZXIgY29zdCBjYWxjdWxhdGVkJywge1xuICAgICAgICBzdG9yYWdlQ29zdCxcbiAgICAgICAgY2FsbENvc3RQZXIxMEssXG4gICAgICAgIGFwaUNhbGxDb3N0LFxuICAgICAgICB0b3RhbENvc3QsXG4gICAgICAgIGNvbmZpZGVuY2UsXG4gICAgICAgIHVzZWRGYWxsYmFjayxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhc3N1bXB0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgLy8gQWRkIGZhbGxiYWNrIHdhcm5pbmcgZmlyc3QgaWYgdXNlZFxuICAgICAgaWYgKHVzZWRGYWxsYmFjaykge1xuICAgICAgICBpZiAoc2VjcmV0U3RvcmFnZVByaWNlID09PSBudWxsKSB7XG4gICAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgZmFsbGJhY2sgc3RvcmFnZSBwcmljaW5nIChBUEkgdW5hdmFpbGFibGUpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFwaUNhbGxQcmljZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIEFQSSBjYWxsIHByaWNpbmcgKEFQSSB1bmF2YWlsYWJsZSknKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY29zdCBicmVha2Rvd25cbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYFNlY3JldCBzdG9yYWdlOiAkJHtzdG9yYWdlQ29zdC50b0ZpeGVkKDIpfS9tb250aGApO1xuICAgICAgYXNzdW1wdGlvbnMucHVzaChcbiAgICAgICAgYEFQSSBjYWxsczogJHttb250aGx5QXBpQ2FsbHMudG9Mb2NhbGVTdHJpbmcoKX0gY2FsbHMgw5cgJCR7Y2FsbENvc3RQZXIxMEsudG9GaXhlZCg0KX0vMTBLID0gJCR7YXBpQ2FsbENvc3QudG9GaXhlZCgyKX0vbW9udGhgLFxuICAgICAgKTtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYFRvdGFsOiAkJHt0b3RhbENvc3QudG9GaXhlZCgyKX0vbW9udGhgKTtcblxuICAgICAgLy8gQWRkIGN1c3RvbSBhc3N1bXB0aW9uIG5vdGVcbiAgICAgIGlmICh0aGlzLmN1c3RvbU1vbnRobHlBcGlDYWxscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBBUEkgY2FsbCB2b2x1bWUgZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBpbmZvcm1hdGlvbmFsIG5vdGVzXG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKCdObyBmcmVlIHRpZXIgZm9yIFNlY3JldHMgTWFuYWdlcicpO1xuICAgICAgYXNzdW1wdGlvbnMucHVzaCgnQ3Jvc3MtcmVnaW9uIHJlcGxpY2F0aW9uIGluY3VycyBhZGRpdGlvbmFsIGNvc3RzIChub3QgY2FsY3VsYXRlZCknKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbENvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZSxcbiAgICAgICAgYXNzdW1wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBMb2dnZXIuZGVidWcoJ1NlY3JldHMgTWFuYWdlciBwcmljaW5nIGNhbGN1bGF0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgU2VjcmV0cyBNYW5hZ2VyIGNvc3Q6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -6,7 +6,9 @@ export { S3Calculator } from './calculators/S3Calculator';
6
6
  export { LambdaCalculator } from './calculators/LambdaCalculator';
7
7
  export { RDSCalculator } from './calculators/RDSCalculator';
8
8
  export { CloudFrontCalculator } from './calculators/CloudFrontCalculator';
9
+ export { EFSCalculator, EFSUsageAssumptions } from './calculators/EFSCalculator';
9
10
  export { ElastiCacheCalculator } from './calculators/ElastiCacheCalculator';
11
+ export { SecretsManagerCalculator } from './calculators/SecretsManagerCalculator';
10
12
  export { SNSCalculator, SNSCostBreakdown } from './calculators/SNSCalculator';
11
13
  export { SQSCalculator } from './calculators/SQSCalculator';
12
14
  export { LaunchTemplateCalculator, LaunchTemplateConfig, EbsVolumeConfig, } from './calculators/LaunchTemplateCalculator';
@@ -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.StepFunctionsCalculator = exports.LaunchTemplateCalculator = exports.SQSCalculator = exports.SNSCalculator = exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
17
+ exports.StepFunctionsCalculator = exports.LaunchTemplateCalculator = exports.SQSCalculator = exports.SNSCalculator = exports.SecretsManagerCalculator = exports.ElastiCacheCalculator = exports.EFSCalculator = 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");
@@ -31,8 +31,12 @@ var RDSCalculator_1 = require("./calculators/RDSCalculator");
31
31
  Object.defineProperty(exports, "RDSCalculator", { enumerable: true, get: function () { return RDSCalculator_1.RDSCalculator; } });
32
32
  var CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
33
33
  Object.defineProperty(exports, "CloudFrontCalculator", { enumerable: true, get: function () { return CloudFrontCalculator_1.CloudFrontCalculator; } });
34
+ var EFSCalculator_1 = require("./calculators/EFSCalculator");
35
+ Object.defineProperty(exports, "EFSCalculator", { enumerable: true, get: function () { return EFSCalculator_1.EFSCalculator; } });
34
36
  var ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
35
37
  Object.defineProperty(exports, "ElastiCacheCalculator", { enumerable: true, get: function () { return ElastiCacheCalculator_1.ElastiCacheCalculator; } });
38
+ var SecretsManagerCalculator_1 = require("./calculators/SecretsManagerCalculator");
39
+ Object.defineProperty(exports, "SecretsManagerCalculator", { enumerable: true, get: function () { return SecretsManagerCalculator_1.SecretsManagerCalculator; } });
36
40
  var SNSCalculator_1 = require("./calculators/SNSCalculator");
37
41
  Object.defineProperty(exports, "SNSCalculator", { enumerable: true, get: function () { return SNSCalculator_1.SNSCalculator; } });
38
42
  var SQSCalculator_1 = require("./calculators/SQSCalculator");
@@ -42,4 +46,4 @@ Object.defineProperty(exports, "LaunchTemplateCalculator", { enumerable: true, g
42
46
  var StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
43
47
  Object.defineProperty(exports, "StepFunctionsCalculator", { enumerable: true, get: function () { return StepFunctionsCalculator_1.StepFunctionsCalculator; } });
44
48
  __exportStar(require("./types"), exports);
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLDZEQUE4RTtBQUFyRSw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QixtRkFJZ0Q7QUFIOUMsb0lBQUEsd0JBQXdCLE9BQUE7QUFJMUIsaUZBRytDO0FBRjdDLGtJQUFBLHVCQUF1QixPQUFBO0FBR3pCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFByaWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi9QcmljaW5nU2VydmljZSc7XG5leHBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmV4cG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmV4cG9ydCB7IEVDMkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDMkNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUzNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TM0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5leHBvcnQgeyBFbGFzdGlDYWNoZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VsYXN0aUNhY2hlQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBTTlNDYWxjdWxhdG9yLCBTTlNDb3N0QnJlYWtkb3duIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TTlNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFNRU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1NRU0NhbGN1bGF0b3InO1xuZXhwb3J0IHtcbiAgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLFxuICBMYXVuY2hUZW1wbGF0ZUNvbmZpZyxcbiAgRWJzVm9sdW1lQ29uZmlnLFxufSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5leHBvcnQge1xuICBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvcixcbiAgU3RlcEZ1bmN0aW9uc1dvcmtmbG93VHlwZSxcbn0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TdGVwRnVuY3Rpb25zQ2FsY3VsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkRBQWlGO0FBQXhFLDhHQUFBLGFBQWEsT0FBQTtBQUN0Qiw2RUFBNEU7QUFBbkUsOEhBQUEscUJBQXFCLE9BQUE7QUFDOUIsbUZBQWtGO0FBQXpFLG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLDZEQUE4RTtBQUFyRSw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QixtRkFJZ0Q7QUFIOUMsb0lBQUEsd0JBQXdCLE9BQUE7QUFJMUIsaUZBRytDO0FBRjdDLGtJQUFBLHVCQUF1QixPQUFBO0FBR3pCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFByaWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi9QcmljaW5nU2VydmljZSc7XG5leHBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmV4cG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmV4cG9ydCB7IEVDMkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDMkNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUzNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TM0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5leHBvcnQgeyBFRlNDYWxjdWxhdG9yLCBFRlNVc2FnZUFzc3VtcHRpb25zIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FRlNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFNlY3JldHNNYW5hZ2VyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU2VjcmV0c01hbmFnZXJDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFNOU0NhbGN1bGF0b3IsIFNOU0Nvc3RCcmVha2Rvd24gfSBmcm9tICcuL2NhbGN1bGF0b3JzL1NOU0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgU1FTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU1FTQ2FsY3VsYXRvcic7XG5leHBvcnQge1xuICBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IsXG4gIExhdW5jaFRlbXBsYXRlQ29uZmlnLFxuICBFYnNWb2x1bWVDb25maWcsXG59IGZyb20gJy4vY2FsY3VsYXRvcnMvTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yJztcbmV4cG9ydCB7XG4gIFN0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yLFxuICBTdGVwRnVuY3Rpb25zV29ya2Zsb3dUeXBlLFxufSBmcm9tICcuL2NhbGN1bGF0b3JzL1N0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
@@ -1 +1 @@
1
- v0.1.32
1
+ v0.1.33
@@ -131,6 +131,99 @@ Total: $2.31/month
131
131
  - Cross-region replication costs not included
132
132
  - Lifecycle policies not considered
133
133
 
134
+ ### AWS::EFS::FileSystem
135
+
136
+ **Description:** Amazon Elastic File System for scalable, shared file storage
137
+
138
+ **Cost Components:**
139
+ - Standard Storage: GB-month for frequently accessed data
140
+ - Infrequent Access (IA) Storage: GB-month for infrequently accessed data
141
+ - IA Requests: Data transferred to/from IA storage
142
+ - Provisioned Throughput: MB/s-month (if configured)
143
+
144
+ **Default Assumptions:**
145
+ - 100 GB total storage
146
+ - 0% in Infrequent Access storage class
147
+ - Bursting throughput mode (no provisioned throughput cost)
148
+ - 10% of IA data accessed per month (for IA request cost estimation)
149
+
150
+ **Configuration:**
151
+ ```yaml
152
+ usageAssumptions:
153
+ efs:
154
+ storageSizeGb: 100
155
+ infrequentAccessPercentage: 0
156
+ ```
157
+
158
+ **Pricing Model:**
159
+ | Component | Price (us-east-1) |
160
+ |-----------|-------------------|
161
+ | Standard Storage | $0.30/GB-month |
162
+ | Infrequent Access Storage | $0.016/GB-month |
163
+ | IA Requests | $0.01/GB transferred |
164
+ | Provisioned Throughput | $6.00/MB/s-month |
165
+
166
+ **Example (Standard Storage Only):**
167
+ ```
168
+ Storage: 100 GB × $0.30/GB = $30.00/month
169
+ ```
170
+
171
+ **Example (With Infrequent Access - 50%):**
172
+ ```
173
+ Standard storage: 50 GB × $0.30/GB = $15.00
174
+ IA storage: 50 GB × $0.016/GB = $0.80
175
+ IA requests: 5 GB × $0.01/GB = $0.05
176
+ Total: $15.85/month
177
+ ```
178
+
179
+ **Example (With Provisioned Throughput):**
180
+ ```
181
+ Storage: 100 GB × $0.30/GB = $30.00
182
+ Provisioned: 10 MB/s × $6.00/MB/s = $60.00
183
+ Total: $90.00/month
184
+ ```
185
+
186
+ **Storage Class Detection:**
187
+
188
+ The calculator automatically detects Infrequent Access usage from CloudFormation template:
189
+
190
+ ```yaml
191
+ # CloudFormation template with lifecycle policy
192
+ Resources:
193
+ MyFileSystem:
194
+ Type: AWS::EFS::FileSystem
195
+ Properties:
196
+ LifecyclePolicies:
197
+ - TransitionToIA: AFTER_30_DAYS
198
+ ```
199
+
200
+ When `TransitionToIA` is detected, the calculator applies the configured `infrequentAccessPercentage` to estimate IA storage costs. Without a lifecycle policy, all storage is calculated at Standard rates.
201
+
202
+ **Throughput Mode Detection:**
203
+
204
+ The calculator detects provisioned throughput from CloudFormation template:
205
+
206
+ ```yaml
207
+ # CloudFormation template with provisioned throughput
208
+ Resources:
209
+ MyFileSystem:
210
+ Type: AWS::EFS::FileSystem
211
+ Properties:
212
+ ThroughputMode: provisioned
213
+ ProvisionedThroughputInMibps: 10
214
+ ```
215
+
216
+ When `ThroughputMode: provisioned` is detected with a `ProvisionedThroughputInMibps` value, the provisioned throughput cost is added to the total.
217
+
218
+ **Notes:**
219
+ - EFS One Zone storage class not currently supported (uses Standard pricing)
220
+ - Archive storage class not calculated
221
+ - Data transfer costs not included
222
+ - Mount target costs not included (no charge)
223
+ - Backup costs not included
224
+ - Actual storage used may vary from assumptions
225
+ - IA request cost assumes 10% of IA data is accessed monthly
226
+
134
227
  ## Database Resources
135
228
 
136
229
  ### AWS::RDS::DBInstance
@@ -761,6 +854,54 @@ Total: $0.02/month
761
854
  - First 4,000 state transitions per month are free tier eligible (Standard)
762
855
  - Activity polling and callbacks may incur additional charges
763
856
 
857
+ ## Security Resources
858
+
859
+ ### AWS::SecretsManager::Secret
860
+
861
+ **Description:** AWS Secrets Manager for credential and secret storage
862
+
863
+ **Cost Components:**
864
+ - Secret storage: $0.40 per secret per month
865
+ - API calls: $0.05 per 10,000 API calls
866
+
867
+ **Default Assumptions:**
868
+ - 10,000 API calls per month (GetSecretValue, DescribeSecret, etc.)
869
+
870
+ **Configuration:**
871
+ ```yaml
872
+ usageAssumptions:
873
+ secretsManager:
874
+ monthlyApiCalls: 10000
875
+ ```
876
+
877
+ **Example:**
878
+ ```
879
+ Secret storage: 1 secret × $0.40 = $0.40/month
880
+ API calls: 10,000 calls × $0.05/10K = $0.05/month
881
+ Total: $0.45/month
882
+ ```
883
+
884
+ **Example with higher API volume:**
885
+ ```yaml
886
+ usageAssumptions:
887
+ secretsManager:
888
+ monthlyApiCalls: 50000
889
+ ```
890
+
891
+ ```
892
+ Secret storage: 1 secret × $0.40 = $0.40/month
893
+ API calls: 50,000 calls × $0.05/10K = $0.25/month
894
+ Total: $0.65/month
895
+ ```
896
+
897
+ **Notes:**
898
+ - No free tier for Secrets Manager
899
+ - Automatic rotation is included in the base secret cost
900
+ - Cross-region replication incurs additional storage costs (not calculated)
901
+ - API call pricing includes GetSecretValue, DescribeSecret, ListSecrets, and other operations
902
+ - Deletion protection can prevent accidental secret deletion
903
+ - Secrets can be rotated automatically using Lambda functions (Lambda costs separate)
904
+
764
905
  ## Container Resources
765
906
 
766
907
  ### AWS::ECS::Service
@@ -823,6 +964,10 @@ usageAssumptions:
823
964
  getRequests: 100000
824
965
  putRequests: 10000
825
966
 
967
+ efs:
968
+ storageSizeGb: 500
969
+ infrequentAccessPercentage: 30 # 30% in Infrequent Access
970
+
826
971
  # Database
827
972
  rds:
828
973
  hoursPerMonth: 730
@@ -891,6 +1036,10 @@ usageAssumptions:
891
1036
  stateTransitionsPerExecution: 15 # State transitions per execution (Standard)
892
1037
  averageDurationMs: 2000 # Average duration in ms (Express)
893
1038
 
1039
+ # Security
1040
+ secretsManager:
1041
+ monthlyApiCalls: 50000 # API calls per month
1042
+
894
1043
  # Containers
895
1044
  ecs:
896
1045
  fargate:
@@ -917,11 +1066,18 @@ const result = await analyzeCosts({
917
1066
  invocationsPerMonth: 5000000,
918
1067
  averageDurationMs: 500,
919
1068
  },
1069
+ efs: {
1070
+ storageSizeGb: 200,
1071
+ infrequentAccessPercentage: 25,
1072
+ },
920
1073
  stepFunctions: {
921
1074
  monthlyExecutions: 50000,
922
1075
  stateTransitionsPerExecution: 15,
923
1076
  averageDurationMs: 2000,
924
1077
  },
1078
+ secretsManager: {
1079
+ monthlyApiCalls: 50000,
1080
+ },
925
1081
  },
926
1082
  });
927
1083
  ```
package/package.json CHANGED
@@ -83,7 +83,7 @@
83
83
  "publishConfig": {
84
84
  "access": "public"
85
85
  },
86
- "version": "0.1.32",
86
+ "version": "0.1.33",
87
87
  "bugs": {
88
88
  "url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
89
89
  },