cdk-cost-analyzer 0.1.1
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.
- package/.cdk-cost-analyzer-cache/metadata.json +12 -0
- package/.gitlab-ci.yml +214 -0
- package/.husky/pre-commit +12 -0
- package/.kiro/hooks/accessibility-audit.kiro.hook +18 -0
- package/.kiro/hooks/api-schema-validation.kiro.hook +21 -0
- package/.kiro/hooks/auto-test-on-save.kiro.hook +19 -0
- package/.kiro/hooks/cdk-synth-on-change.kiro.hook +20 -0
- package/.kiro/hooks/code-coverage-check.kiro.hook +14 -0
- package/.kiro/hooks/commit-message-helper.kiro.hook +14 -0
- package/.kiro/hooks/dependency-update-check.kiro.hook +14 -0
- package/.kiro/hooks/env-file-validation.kiro.hook +18 -0
- package/.kiro/hooks/lint-and-format-on-save.kiro.hook +21 -0
- package/.kiro/hooks/mcp-config-validation.kiro.hook +17 -0
- package/.kiro/hooks/mcp-server-test.kiro.hook +14 -0
- package/.kiro/hooks/performance-analysis.kiro.hook +14 -0
- package/.kiro/hooks/readme-spell-check.kiro.hook +14 -0
- package/.kiro/hooks/security-scan-on-dependency-change.kiro.hook +21 -0
- package/.kiro/hooks/translation-update.kiro.hook +18 -0
- package/.kiro/hooks/update-documentation.kiro.hook +18 -0
- package/.kiro/settings/mcp.json +20 -0
- package/.kiro/specs/cdk-cost-analyzer/design.md +620 -0
- package/.kiro/specs/cdk-cost-analyzer/requirements.md +183 -0
- package/.kiro/specs/cdk-cost-analyzer/tasks.md +357 -0
- package/.kiro/specs/github-actions-ci/design.md +281 -0
- package/.kiro/specs/github-actions-ci/requirements.md +86 -0
- package/.kiro/specs/github-actions-ci/tasks.md +115 -0
- package/.kiro/specs/nlb-calculator-test-coverage/design.md +190 -0
- package/.kiro/specs/nlb-calculator-test-coverage/requirements.md +84 -0
- package/.kiro/specs/nlb-calculator-test-coverage/tasks.md +150 -0
- package/.kiro/specs/production-readiness/design.md +1213 -0
- package/.kiro/specs/production-readiness/requirements.md +312 -0
- package/.kiro/specs/production-readiness/tasks.md +269 -0
- package/.kiro/specs/repository-cleanup/design.md +283 -0
- package/.kiro/specs/repository-cleanup/requirements.md +74 -0
- package/.kiro/specs/repository-cleanup/tasks.md +64 -0
- package/.kiro/steering/aws-cli-best-practices.md +41 -0
- package/.kiro/steering/cdk-best-practices.md +49 -0
- package/.kiro/steering/development-standards.md +54 -0
- package/.kiro/steering/docker-best-practices.md +34 -0
- package/.kiro/steering/documentation-style.md +151 -0
- package/.kiro/steering/git-best-practices.md +37 -0
- package/.kiro/steering/mcp-best-practices.md +95 -0
- package/.kiro/steering/python-best-practices.md +48 -0
- package/.kiro/steering/react-best-practices.md +44 -0
- package/.kiro/steering/security-best-practices.md +41 -0
- package/.kiro/steering/testing-best-practices.md +59 -0
- package/.kiro/steering/typescript-best-practices.md +40 -0
- package/CHANGELOG.md +49 -0
- package/CONTRIBUTING.md +258 -0
- package/LICENSE +19 -0
- package/README.md +480 -0
- package/SECURITY.md +117 -0
- package/dist/api/index.d.ts +11 -0
- package/dist/api/index.js +65 -0
- package/dist/api/types.d.ts +15 -0
- package/dist/api/types.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +262 -0
- package/dist/config/ConfigManager.d.ts +40 -0
- package/dist/config/ConfigManager.js +238 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +19 -0
- package/dist/config/types.d.ts +72 -0
- package/dist/config/types.js +15 -0
- package/dist/diff/DiffEngine.d.ts +7 -0
- package/dist/diff/DiffEngine.js +73 -0
- package/dist/diff/index.d.ts +2 -0
- package/dist/diff/index.js +21 -0
- package/dist/diff/types.d.ts +20 -0
- package/dist/diff/types.js +3 -0
- package/dist/integrations/GitLabIntegration.d.ts +7 -0
- package/dist/integrations/GitLabIntegration.js +45 -0
- package/dist/integrations/index.d.ts +2 -0
- package/dist/integrations/index.js +21 -0
- package/dist/integrations/types.d.ts +11 -0
- package/dist/integrations/types.js +13 -0
- package/dist/parser/TemplateParser.d.ts +8 -0
- package/dist/parser/TemplateParser.js +75 -0
- package/dist/parser/index.d.ts +2 -0
- package/dist/parser/index.js +22 -0
- package/dist/parser/types.d.ts +30 -0
- package/dist/parser/types.js +3 -0
- package/dist/pipeline/PipelineOrchestrator.d.ts +23 -0
- package/dist/pipeline/PipelineOrchestrator.js +191 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +19 -0
- package/dist/pipeline/types.d.ts +41 -0
- package/dist/pipeline/types.js +13 -0
- package/dist/pricing/CacheManager.d.ts +75 -0
- package/dist/pricing/CacheManager.js +195 -0
- package/dist/pricing/PricingClient.d.ts +17 -0
- package/dist/pricing/PricingClient.js +122 -0
- package/dist/pricing/PricingService.d.ts +16 -0
- package/dist/pricing/PricingService.js +149 -0
- package/dist/pricing/calculators/ALBCalculator.d.ts +16 -0
- package/dist/pricing/calculators/ALBCalculator.js +163 -0
- package/dist/pricing/calculators/APIGatewayCalculator.d.ts +10 -0
- package/dist/pricing/calculators/APIGatewayCalculator.js +177 -0
- package/dist/pricing/calculators/CloudFrontCalculator.d.ts +59 -0
- package/dist/pricing/calculators/CloudFrontCalculator.js +151 -0
- package/dist/pricing/calculators/DynamoDBCalculator.d.ts +9 -0
- package/dist/pricing/calculators/DynamoDBCalculator.js +146 -0
- package/dist/pricing/calculators/EC2Calculator.d.ts +7 -0
- package/dist/pricing/calculators/EC2Calculator.js +80 -0
- package/dist/pricing/calculators/ECSCalculator.d.ts +9 -0
- package/dist/pricing/calculators/ECSCalculator.js +116 -0
- package/dist/pricing/calculators/ElastiCacheCalculator.d.ts +8 -0
- package/dist/pricing/calculators/ElastiCacheCalculator.js +106 -0
- package/dist/pricing/calculators/LambdaCalculator.d.ts +13 -0
- package/dist/pricing/calculators/LambdaCalculator.js +111 -0
- package/dist/pricing/calculators/NLBCalculator.d.ts +16 -0
- package/dist/pricing/calculators/NLBCalculator.js +138 -0
- package/dist/pricing/calculators/NatGatewayCalculator.d.ts +12 -0
- package/dist/pricing/calculators/NatGatewayCalculator.js +116 -0
- package/dist/pricing/calculators/RDSCalculator.d.ts +9 -0
- package/dist/pricing/calculators/RDSCalculator.js +103 -0
- package/dist/pricing/calculators/S3Calculator.d.ts +8 -0
- package/dist/pricing/calculators/S3Calculator.js +68 -0
- package/dist/pricing/calculators/VPCEndpointCalculator.d.ts +12 -0
- package/dist/pricing/calculators/VPCEndpointCalculator.js +129 -0
- package/dist/pricing/index.d.ts +10 -0
- package/dist/pricing/index.js +37 -0
- package/dist/pricing/types.d.ts +53 -0
- package/dist/pricing/types.js +22 -0
- package/dist/releasetag.txt +1 -0
- package/dist/reporter/Reporter.d.ts +18 -0
- package/dist/reporter/Reporter.js +412 -0
- package/dist/reporter/index.d.ts +2 -0
- package/dist/reporter/index.js +21 -0
- package/dist/reporter/types.d.ts +72 -0
- package/dist/reporter/types.js +3 -0
- package/dist/synthesis/SynthesisOrchestrator.d.ts +26 -0
- package/dist/synthesis/SynthesisOrchestrator.js +243 -0
- package/dist/synthesis/index.d.ts +2 -0
- package/dist/synthesis/index.js +19 -0
- package/dist/synthesis/types.d.ts +17 -0
- package/dist/synthesis/types.js +13 -0
- package/dist/threshold/ThresholdEnforcer.d.ts +29 -0
- package/dist/threshold/ThresholdEnforcer.js +143 -0
- package/dist/threshold/index.d.ts +2 -0
- package/dist/threshold/index.js +19 -0
- package/dist/threshold/types.d.ts +15 -0
- package/dist/threshold/types.js +17 -0
- package/docs/CALCULATORS.md +820 -0
- package/docs/CI_CD.md +608 -0
- package/docs/CONFIGURATION.md +407 -0
- package/docs/DEVELOPMENT.md +387 -0
- package/docs/RELEASE.md +223 -0
- package/docs/TROUBLESHOOTING.md +847 -0
- package/examples/.cdk-cost-analyzer.yml +85 -0
- package/examples/.gitlab-ci.yml +125 -0
- package/examples/api-usage.js +26 -0
- package/examples/complex/base.json +16 -0
- package/examples/complex/target.json +29 -0
- package/examples/monorepo/.gitlab-ci.yml +251 -0
- package/examples/monorepo/README.md +341 -0
- package/examples/monorepo/package.json +27 -0
- package/examples/monorepo/packages/backend-infra/.cdk-cost-analyzer.yml +34 -0
- package/examples/monorepo/packages/backend-infra/bin/app.ts +16 -0
- package/examples/monorepo/packages/backend-infra/cdk.json +7 -0
- package/examples/monorepo/packages/backend-infra/lib/backend-stack.ts +128 -0
- package/examples/monorepo/packages/backend-infra/package.json +30 -0
- package/examples/monorepo/packages/backend-infra/tsconfig.json +11 -0
- package/examples/monorepo/packages/data-infra/.cdk-cost-analyzer.yml +38 -0
- package/examples/monorepo/packages/data-infra/bin/app.ts +16 -0
- package/examples/monorepo/packages/data-infra/cdk.json +7 -0
- package/examples/monorepo/packages/data-infra/lib/data-stack.ts +121 -0
- package/examples/monorepo/packages/data-infra/package.json +30 -0
- package/examples/monorepo/packages/data-infra/tsconfig.json +11 -0
- package/examples/monorepo/packages/frontend-infra/.cdk-cost-analyzer.yml +31 -0
- package/examples/monorepo/packages/frontend-infra/bin/app.ts +16 -0
- package/examples/monorepo/packages/frontend-infra/cdk.json +7 -0
- package/examples/monorepo/packages/frontend-infra/lib/frontend-stack.ts +60 -0
- package/examples/monorepo/packages/frontend-infra/package.json +30 -0
- package/examples/monorepo/packages/frontend-infra/tsconfig.json +11 -0
- package/examples/monorepo/tsconfig.json +35 -0
- package/examples/multi-stack/.cdk-cost-analyzer.yml +72 -0
- package/examples/multi-stack/.gitlab-ci.yml +184 -0
- package/examples/multi-stack/README.md +279 -0
- package/examples/multi-stack/bin/app.ts +36 -0
- package/examples/multi-stack/cdk.json +72 -0
- package/examples/multi-stack/lib/compute-stack.ts +128 -0
- package/examples/multi-stack/lib/networking-stack.ts +69 -0
- package/examples/multi-stack/lib/storage-stack.ts +141 -0
- package/examples/multi-stack/package-lock.json +4437 -0
- package/examples/multi-stack/package.json +42 -0
- package/examples/multi-stack/tsconfig.json +34 -0
- package/examples/simple/base.json +8 -0
- package/examples/simple/target.json +14 -0
- package/examples/single-stack/.NVP +0 -0
- package/examples/single-stack/.cdk-cost-analyzer.yml +52 -0
- package/examples/single-stack/.gitlab-ci.yml +126 -0
- package/examples/single-stack/README.md +184 -0
- package/examples/single-stack/UeK +0 -0
- package/examples/single-stack/bin/app.ts +16 -0
- package/examples/single-stack/cdk.json +72 -0
- package/examples/single-stack/lib/infrastructure-stack.ts +119 -0
- package/examples/single-stack/package-lock.json +4443 -0
- package/examples/single-stack/package.json +38 -0
- package/examples/single-stack/tsconfig.json +34 -0
- package/package.json +139 -0
- package/test-cdk-project/README-COMPUTE.md +141 -0
- package/test-cdk-project/README.md +95 -0
- package/test-cdk-project/app-with-compute.js +102 -0
- package/test-cdk-project/app.js +81 -0
- package/test-cdk-project/cdk-compute.json +3 -0
- package/test-cdk-project/cdk.context.json +7 -0
- package/test-cdk-project/cdk.json +3 -0
- package/test-cdk-project/cdk.out/TestStack.assets.json +21 -0
- package/test-cdk-project/cdk.out/TestStack.template.json +115 -0
- package/test-cdk-project/cdk.out/cdk.out +1 -0
- package/test-cdk-project/cdk.out/manifest.json +503 -0
- package/test-cdk-project/cdk.out/tree.json +1 -0
- package/test-cdk-project/cdk.out.base/TestStack.assets.json +21 -0
- package/test-cdk-project/cdk.out.base/TestStack.template.json +115 -0
- package/test-cdk-project/cdk.out.base/cdk.out +1 -0
- package/test-cdk-project/cdk.out.base/manifest.json +503 -0
- package/test-cdk-project/cdk.out.base/tree.json +1 -0
- package/test-cdk-project/cdk.out.target/TestStack.assets.json +21 -0
- package/test-cdk-project/cdk.out.target/TestStack.template.json +183 -0
- package/test-cdk-project/cdk.out.target/cdk.out +1 -0
- package/test-cdk-project/cdk.out.target/manifest.json +521 -0
- package/test-cdk-project/cdk.out.target/tree.json +1 -0
- package/test-cdk-project/package-lock.json +422 -0
- package/test-cdk-project/package.json +17 -0
- package/tools/workflows/README.md +102 -0
- package/tools/workflows/validate-workflows.js +109 -0
- package/tools/workflows/workflow-utils.ts +181 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VPCEndpointCalculator = void 0;
|
|
4
|
+
class VPCEndpointCalculator {
|
|
5
|
+
customDataProcessedGB;
|
|
6
|
+
DEFAULT_DATA_PROCESSED_GB = 100;
|
|
7
|
+
HOURS_PER_MONTH = 730;
|
|
8
|
+
constructor(customDataProcessedGB) {
|
|
9
|
+
this.customDataProcessedGB = customDataProcessedGB;
|
|
10
|
+
}
|
|
11
|
+
supports(resourceType) {
|
|
12
|
+
return resourceType === 'AWS::EC2::VPCEndpoint';
|
|
13
|
+
}
|
|
14
|
+
async calculateCost(resource, region, pricingClient) {
|
|
15
|
+
const explicitEndpointType = resource.properties?.VpcEndpointType;
|
|
16
|
+
const serviceName = resource.properties?.ServiceName || '';
|
|
17
|
+
// Determine if this is a Gateway endpoint
|
|
18
|
+
// Priority: explicit type > inferred from service name
|
|
19
|
+
const isGatewayEndpoint = explicitEndpointType === 'Gateway' ||
|
|
20
|
+
(explicitEndpointType === undefined &&
|
|
21
|
+
(serviceName.includes('s3') || serviceName.includes('dynamodb')));
|
|
22
|
+
// Gateway endpoints (S3 and DynamoDB) are free
|
|
23
|
+
if (isGatewayEndpoint) {
|
|
24
|
+
return {
|
|
25
|
+
amount: 0,
|
|
26
|
+
currency: 'USD',
|
|
27
|
+
confidence: 'high',
|
|
28
|
+
assumptions: [
|
|
29
|
+
'Gateway VPC endpoints for S3 and DynamoDB are free',
|
|
30
|
+
'No data processing charges for gateway endpoints',
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Interface endpoints have hourly and data processing costs
|
|
35
|
+
try {
|
|
36
|
+
// Get hourly rate per endpoint
|
|
37
|
+
const hourlyRate = await pricingClient.getPrice({
|
|
38
|
+
serviceCode: 'AmazonVPC',
|
|
39
|
+
region: this.normalizeRegion(region),
|
|
40
|
+
filters: [
|
|
41
|
+
{ field: 'productFamily', value: 'VpcEndpoint' },
|
|
42
|
+
{ field: 'usagetype', value: `${this.getRegionPrefix(region)}VpcEndpoint-Hours` },
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
// Get data processing rate
|
|
46
|
+
const dataProcessingRate = await pricingClient.getPrice({
|
|
47
|
+
serviceCode: 'AmazonVPC',
|
|
48
|
+
region: this.normalizeRegion(region),
|
|
49
|
+
filters: [
|
|
50
|
+
{ field: 'productFamily', value: 'VpcEndpoint' },
|
|
51
|
+
{ field: 'usagetype', value: `${this.getRegionPrefix(region)}VpcEndpoint-Bytes` },
|
|
52
|
+
],
|
|
53
|
+
});
|
|
54
|
+
if (hourlyRate === null || dataProcessingRate === null) {
|
|
55
|
+
return {
|
|
56
|
+
amount: 0,
|
|
57
|
+
currency: 'USD',
|
|
58
|
+
confidence: 'unknown',
|
|
59
|
+
assumptions: [
|
|
60
|
+
`Pricing data not available for VPC Endpoint in region ${region}`,
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const dataProcessedGB = this.customDataProcessedGB || this.DEFAULT_DATA_PROCESSED_GB;
|
|
65
|
+
const hourlyCost = hourlyRate * this.HOURS_PER_MONTH;
|
|
66
|
+
const dataProcessingCost = dataProcessingRate * dataProcessedGB;
|
|
67
|
+
const totalCost = hourlyCost + dataProcessingCost;
|
|
68
|
+
return {
|
|
69
|
+
amount: totalCost,
|
|
70
|
+
currency: 'USD',
|
|
71
|
+
confidence: 'medium',
|
|
72
|
+
assumptions: [
|
|
73
|
+
'Interface VPC Endpoint type',
|
|
74
|
+
`Hourly rate: $${hourlyRate.toFixed(4)}/hour × ${this.HOURS_PER_MONTH} hours = $${hourlyCost.toFixed(2)}/month`,
|
|
75
|
+
`Data processing: $${dataProcessingRate.toFixed(4)}/GB × ${dataProcessedGB} GB = $${dataProcessingCost.toFixed(2)}/month`,
|
|
76
|
+
`Total: $${totalCost.toFixed(2)}/month`,
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
return {
|
|
82
|
+
amount: 0,
|
|
83
|
+
currency: 'USD',
|
|
84
|
+
confidence: 'unknown',
|
|
85
|
+
assumptions: [`Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
normalizeRegion(region) {
|
|
90
|
+
const regionMap = {
|
|
91
|
+
'us-east-1': 'US East (N. Virginia)',
|
|
92
|
+
'us-east-2': 'US East (Ohio)',
|
|
93
|
+
'us-west-1': 'US West (N. California)',
|
|
94
|
+
'us-west-2': 'US West (Oregon)',
|
|
95
|
+
'eu-west-1': 'EU (Ireland)',
|
|
96
|
+
'eu-west-2': 'EU (London)',
|
|
97
|
+
'eu-west-3': 'EU (Paris)',
|
|
98
|
+
'eu-central-1': 'EU (Frankfurt)',
|
|
99
|
+
'eu-north-1': 'EU (Stockholm)',
|
|
100
|
+
'ap-south-1': 'Asia Pacific (Mumbai)',
|
|
101
|
+
'ap-southeast-1': 'Asia Pacific (Singapore)',
|
|
102
|
+
'ap-southeast-2': 'Asia Pacific (Sydney)',
|
|
103
|
+
'ap-northeast-1': 'Asia Pacific (Tokyo)',
|
|
104
|
+
'ap-northeast-2': 'Asia Pacific (Seoul)',
|
|
105
|
+
};
|
|
106
|
+
return regionMap[region] || region;
|
|
107
|
+
}
|
|
108
|
+
getRegionPrefix(region) {
|
|
109
|
+
const prefixMap = {
|
|
110
|
+
'us-east-1': 'USE1',
|
|
111
|
+
'us-east-2': 'USE2',
|
|
112
|
+
'us-west-1': 'USW1',
|
|
113
|
+
'us-west-2': 'USW2',
|
|
114
|
+
'eu-west-1': 'EUW1',
|
|
115
|
+
'eu-west-2': 'EUW2',
|
|
116
|
+
'eu-west-3': 'EUW3',
|
|
117
|
+
'eu-central-1': 'EUC1',
|
|
118
|
+
'eu-north-1': 'EUN1',
|
|
119
|
+
'ap-south-1': 'APS1',
|
|
120
|
+
'ap-southeast-1': 'APS2',
|
|
121
|
+
'ap-southeast-2': 'APS3',
|
|
122
|
+
'ap-northeast-1': 'APN1',
|
|
123
|
+
'ap-northeast-2': 'APN2',
|
|
124
|
+
};
|
|
125
|
+
return prefixMap[region] || '';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.VPCEndpointCalculator = VPCEndpointCalculator;
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVlBDRW5kcG9pbnRDYWxjdWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaWNpbmcvY2FsY3VsYXRvcnMvVlBDRW5kcG9pbnRDYWxjdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLE1BQWEscUJBQXFCO0lBSVo7SUFISCx5QkFBeUIsR0FBRyxHQUFHLENBQUM7SUFDaEMsZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUV2QyxZQUFvQixxQkFBOEI7UUFBOUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFTO0lBQUcsQ0FBQztJQUV0RCxRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssdUJBQXVCLENBQUM7SUFDbEQsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQ2pCLFFBQXdCLEVBQ3hCLE1BQWMsRUFDZCxhQUE0QjtRQUU1QixNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsZUFBcUMsQ0FBQztRQUN4RixNQUFNLFdBQVcsR0FBSSxRQUFRLENBQUMsVUFBVSxFQUFFLFdBQWtDLElBQUksRUFBRSxDQUFDO1FBRW5GLDBDQUEwQztRQUMxQyx1REFBdUQ7UUFDdkQsTUFBTSxpQkFBaUIsR0FDckIsb0JBQW9CLEtBQUssU0FBUztZQUNsQyxDQUFDLG9CQUFvQixLQUFLLFNBQVM7Z0JBQ2pDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSwrQ0FBK0M7UUFDL0MsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLE1BQU07Z0JBQ2xCLFdBQVcsRUFBRTtvQkFDWCxvREFBb0Q7b0JBQ3BELGtEQUFrRDtpQkFDbkQ7YUFDRixDQUFDO1FBQ0os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LEVBQUUsa0JBQWtCO1lBQy9CLFdBQVcsRUFBRSxjQUFjO1lBQzNCLFdBQVcsRUFBRSxhQUFhO1lBQzFCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLGNBQWMsRUFBRSxnQkFBZ0I7WUFDaEMsWUFBWSxFQUFFLGdCQUFnQjtZQUM5QixZQUFZLEVBQUUsdUJBQXVCO1lBQ3JDLGdCQUFnQixFQUFFLDBCQUEwQjtZQUM1QyxnQkFBZ0IsRUFBRSx1QkFBdUI7WUFDekMsZ0JBQWdCLEVBQUUsc0JBQXNCO1lBQ3hDLGdCQUFnQixFQUFFLHNCQUFzQjtTQUN6QyxDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBYztRQUNwQyxNQUFNLFNBQVMsR0FBMkI7WUFDeEMsV0FBVyxFQUFFLE1BQU07WUFDbkIsV0FBVyxFQUFFLE1BQU07WUFDbkIsV0FBVyxFQUFFLE1BQU07WUFDbkIsV0FBVyxFQUFFLE1BQU07WUFDbkIsV0FBVyxFQUFFLE1BQU07WUFDbkIsV0FBVyxFQUFFLE1BQU07WUFDbkIsV0FBVyxFQUFFLE1BQU07WUFDbkIsY0FBYyxFQUFFLE1BQU07WUFDdEIsWUFBWSxFQUFFLE1BQU07WUFDcEIsWUFBWSxFQUFFLE1BQU07WUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLGdCQUFnQixFQUFFLE1BQU07WUFDeEIsZ0JBQWdCLEVBQUUsTUFBTTtTQUN6QixDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQTFJRCxzREEwSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciwgTW9udGhseUNvc3QsIFByaWNpbmdDbGllbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBWUENFbmRwb2ludENhbGN1bGF0b3IgaW1wbGVtZW50cyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yIHtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0RBVEFfUFJPQ0VTU0VEX0dCID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IEhPVVJTX1BFUl9NT05USCA9IDczMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGN1c3RvbURhdGFQcm9jZXNzZWRHQj86IG51bWJlcikge31cblxuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OkVDMjo6VlBDRW5kcG9pbnQnO1xuICB9XG5cbiAgYXN5bmMgY2FsY3VsYXRlQ29zdChcbiAgICByZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IGV4cGxpY2l0RW5kcG9pbnRUeXBlID0gcmVzb3VyY2UucHJvcGVydGllcz8uVnBjRW5kcG9pbnRUeXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IChyZXNvdXJjZS5wcm9wZXJ0aWVzPy5TZXJ2aWNlTmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpIHx8ICcnO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBHYXRld2F5IGVuZHBvaW50XG4gICAgLy8gUHJpb3JpdHk6IGV4cGxpY2l0IHR5cGUgPiBpbmZlcnJlZCBmcm9tIHNlcnZpY2UgbmFtZVxuICAgIGNvbnN0IGlzR2F0ZXdheUVuZHBvaW50ID1cbiAgICAgIGV4cGxpY2l0RW5kcG9pbnRUeXBlID09PSAnR2F0ZXdheScgfHxcbiAgICAgIChleHBsaWNpdEVuZHBvaW50VHlwZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChzZXJ2aWNlTmFtZS5pbmNsdWRlcygnczMnKSB8fCBzZXJ2aWNlTmFtZS5pbmNsdWRlcygnZHluYW1vZGInKSkpO1xuXG4gICAgLy8gR2F0ZXdheSBlbmRwb2ludHMgKFMzIGFuZCBEeW5hbW9EQikgYXJlIGZyZWVcbiAgICBpZiAoaXNHYXRld2F5RW5kcG9pbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgJ0dhdGV3YXkgVlBDIGVuZHBvaW50cyBmb3IgUzMgYW5kIER5bmFtb0RCIGFyZSBmcmVlJyxcbiAgICAgICAgICAnTm8gZGF0YSBwcm9jZXNzaW5nIGNoYXJnZXMgZm9yIGdhdGV3YXkgZW5kcG9pbnRzJyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZXJmYWNlIGVuZHBvaW50cyBoYXZlIGhvdXJseSBhbmQgZGF0YSBwcm9jZXNzaW5nIGNvc3RzXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBob3VybHkgcmF0ZSBwZXIgZW5kcG9pbnRcbiAgICAgIGNvbnN0IGhvdXJseVJhdGUgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25WUEMnLFxuICAgICAgICByZWdpb246IHRoaXMubm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnVnBjRW5kcG9pbnQnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiBgJHt0aGlzLmdldFJlZ2lvblByZWZpeChyZWdpb24pfVZwY0VuZHBvaW50LUhvdXJzYCB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBkYXRhIHByb2Nlc3NpbmcgcmF0ZVxuICAgICAgY29uc3QgZGF0YVByb2Nlc3NpbmdSYXRlID0gYXdhaXQgcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uVlBDJyxcbiAgICAgICAgcmVnaW9uOiB0aGlzLm5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ1ZwY0VuZHBvaW50JyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogYCR7dGhpcy5nZXRSZWdpb25QcmVmaXgocmVnaW9uKX1WcGNFbmRwb2ludC1CeXRlc2AgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaG91cmx5UmF0ZSA9PT0gbnVsbCB8fCBkYXRhUHJvY2Vzc2luZ1JhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgYFByaWNpbmcgZGF0YSBub3QgYXZhaWxhYmxlIGZvciBWUEMgRW5kcG9pbnQgaW4gcmVnaW9uICR7cmVnaW9ufWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YVByb2Nlc3NlZEdCID0gdGhpcy5jdXN0b21EYXRhUHJvY2Vzc2VkR0IgfHwgdGhpcy5ERUZBVUxUX0RBVEFfUFJPQ0VTU0VEX0dCO1xuICAgICAgY29uc3QgaG91cmx5Q29zdCA9IGhvdXJseVJhdGUgKiB0aGlzLkhPVVJTX1BFUl9NT05USDtcbiAgICAgIGNvbnN0IGRhdGFQcm9jZXNzaW5nQ29zdCA9IGRhdGFQcm9jZXNzaW5nUmF0ZSAqIGRhdGFQcm9jZXNzZWRHQjtcbiAgICAgIGNvbnN0IHRvdGFsQ29zdCA9IGhvdXJseUNvc3QgKyBkYXRhUHJvY2Vzc2luZ0Nvc3Q7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogdG90YWxDb3N0LFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICdtZWRpdW0nLFxuICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICdJbnRlcmZhY2UgVlBDIEVuZHBvaW50IHR5cGUnLFxuICAgICAgICAgIGBIb3VybHkgcmF0ZTogJCR7aG91cmx5UmF0ZS50b0ZpeGVkKDQpfS9ob3VyIMOXICR7dGhpcy5IT1VSU19QRVJfTU9OVEh9IGhvdXJzID0gJCR7aG91cmx5Q29zdC50b0ZpeGVkKDIpfS9tb250aGAsXG4gICAgICAgICAgYERhdGEgcHJvY2Vzc2luZzogJCR7ZGF0YVByb2Nlc3NpbmdSYXRlLnRvRml4ZWQoNCl9L0dCIMOXICR7ZGF0YVByb2Nlc3NlZEdCfSBHQiA9ICQke2RhdGFQcm9jZXNzaW5nQ29zdC50b0ZpeGVkKDIpfS9tb250aGAsXG4gICAgICAgICAgYFRvdGFsOiAkJHt0b3RhbENvc3QudG9GaXhlZCgyKX0vbW9udGhgLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgRmFpbGVkIHRvIGZldGNoIHByaWNpbmc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVJlZ2lvbihyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnaW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3VzLWVhc3QtMSc6ICdVUyBFYXN0IChOLiBWaXJnaW5pYSknLFxuICAgICAgJ3VzLWVhc3QtMic6ICdVUyBFYXN0IChPaGlvKScsXG4gICAgICAndXMtd2VzdC0xJzogJ1VTIFdlc3QgKE4uIENhbGlmb3JuaWEpJyxcbiAgICAgICd1cy13ZXN0LTInOiAnVVMgV2VzdCAoT3JlZ29uKScsXG4gICAgICAnZXUtd2VzdC0xJzogJ0VVIChJcmVsYW5kKScsXG4gICAgICAnZXUtd2VzdC0yJzogJ0VVIChMb25kb24pJyxcbiAgICAgICdldS13ZXN0LTMnOiAnRVUgKFBhcmlzKScsXG4gICAgICAnZXUtY2VudHJhbC0xJzogJ0VVIChGcmFua2Z1cnQpJyxcbiAgICAgICdldS1ub3J0aC0xJzogJ0VVIChTdG9ja2hvbG0pJyxcbiAgICAgICdhcC1zb3V0aC0xJzogJ0FzaWEgUGFjaWZpYyAoTXVtYmFpKScsXG4gICAgICAnYXAtc291dGhlYXN0LTEnOiAnQXNpYSBQYWNpZmljIChTaW5nYXBvcmUpJyxcbiAgICAgICdhcC1zb3V0aGVhc3QtMic6ICdBc2lhIFBhY2lmaWMgKFN5ZG5leSknLFxuICAgICAgJ2FwLW5vcnRoZWFzdC0xJzogJ0FzaWEgUGFjaWZpYyAoVG9reW8pJyxcbiAgICAgICdhcC1ub3J0aGVhc3QtMic6ICdBc2lhIFBhY2lmaWMgKFNlb3VsKScsXG4gICAgfTtcblxuICAgIHJldHVybiByZWdpb25NYXBbcmVnaW9uXSB8fCByZWdpb247XG4gIH1cblxuICBwcml2YXRlIGdldFJlZ2lvblByZWZpeChyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3VzLWVhc3QtMSc6ICdVU0UxJyxcbiAgICAgICd1cy1lYXN0LTInOiAnVVNFMicsXG4gICAgICAndXMtd2VzdC0xJzogJ1VTVzEnLFxuICAgICAgJ3VzLXdlc3QtMic6ICdVU1cyJyxcbiAgICAgICdldS13ZXN0LTEnOiAnRVVXMScsXG4gICAgICAnZXUtd2VzdC0yJzogJ0VVVzInLFxuICAgICAgJ2V1LXdlc3QtMyc6ICdFVVczJyxcbiAgICAgICdldS1jZW50cmFsLTEnOiAnRVVDMScsXG4gICAgICAnZXUtbm9ydGgtMSc6ICdFVU4xJyxcbiAgICAgICdhcC1zb3V0aC0xJzogJ0FQUzEnLFxuICAgICAgJ2FwLXNvdXRoZWFzdC0xJzogJ0FQUzInLFxuICAgICAgJ2FwLXNvdXRoZWFzdC0yJzogJ0FQUzMnLFxuICAgICAgJ2FwLW5vcnRoZWFzdC0xJzogJ0FQTjEnLFxuICAgICAgJ2FwLW5vcnRoZWFzdC0yJzogJ0FQTjInLFxuICAgIH07XG5cbiAgICByZXR1cm4gcHJlZml4TWFwW3JlZ2lvbl0gfHwgJyc7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { PricingService } from './PricingService';
|
|
2
|
+
export { PricingClient } from './PricingClient';
|
|
3
|
+
export { CacheManager } from './CacheManager';
|
|
4
|
+
export { EC2Calculator } from './calculators/EC2Calculator';
|
|
5
|
+
export { S3Calculator } from './calculators/S3Calculator';
|
|
6
|
+
export { LambdaCalculator } from './calculators/LambdaCalculator';
|
|
7
|
+
export { RDSCalculator } from './calculators/RDSCalculator';
|
|
8
|
+
export { CloudFrontCalculator } from './calculators/CloudFrontCalculator';
|
|
9
|
+
export { ElastiCacheCalculator } from './calculators/ElastiCacheCalculator';
|
|
10
|
+
export * from './types';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
|
|
18
|
+
var PricingService_1 = require("./PricingService");
|
|
19
|
+
Object.defineProperty(exports, "PricingService", { enumerable: true, get: function () { return PricingService_1.PricingService; } });
|
|
20
|
+
var PricingClient_1 = require("./PricingClient");
|
|
21
|
+
Object.defineProperty(exports, "PricingClient", { enumerable: true, get: function () { return PricingClient_1.PricingClient; } });
|
|
22
|
+
var CacheManager_1 = require("./CacheManager");
|
|
23
|
+
Object.defineProperty(exports, "CacheManager", { enumerable: true, get: function () { return CacheManager_1.CacheManager; } });
|
|
24
|
+
var EC2Calculator_1 = require("./calculators/EC2Calculator");
|
|
25
|
+
Object.defineProperty(exports, "EC2Calculator", { enumerable: true, get: function () { return EC2Calculator_1.EC2Calculator; } });
|
|
26
|
+
var S3Calculator_1 = require("./calculators/S3Calculator");
|
|
27
|
+
Object.defineProperty(exports, "S3Calculator", { enumerable: true, get: function () { return S3Calculator_1.S3Calculator; } });
|
|
28
|
+
var LambdaCalculator_1 = require("./calculators/LambdaCalculator");
|
|
29
|
+
Object.defineProperty(exports, "LambdaCalculator", { enumerable: true, get: function () { return LambdaCalculator_1.LambdaCalculator; } });
|
|
30
|
+
var RDSCalculator_1 = require("./calculators/RDSCalculator");
|
|
31
|
+
Object.defineProperty(exports, "RDSCalculator", { enumerable: true, get: function () { return RDSCalculator_1.RDSCalculator; } });
|
|
32
|
+
var CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
|
|
33
|
+
Object.defineProperty(exports, "CloudFrontCalculator", { enumerable: true, get: function () { return CloudFrontCalculator_1.CloudFrontCalculator; } });
|
|
34
|
+
var ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
|
|
35
|
+
Object.defineProperty(exports, "ElastiCacheCalculator", { enumerable: true, get: function () { return ElastiCacheCalculator_1.ElastiCacheCalculator; } });
|
|
36
|
+
__exportStar(require("./types"), exports);
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFByaWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi9QcmljaW5nU2VydmljZSc7XG5leHBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmV4cG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmV4cG9ydCB7IEVDMkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDMkNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUzNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9TM0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5leHBvcnQgeyBFbGFzdGlDYWNoZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VsYXN0aUNhY2hlQ2FsY3VsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ResourceWithId, ResourceDiff } from '../diff/types';
|
|
2
|
+
export interface PricingService {
|
|
3
|
+
getResourceCost(resource: ResourceWithId, region: string): Promise<MonthlyCost>;
|
|
4
|
+
getCostDelta(diff: ResourceDiff, region: string): Promise<CostDelta>;
|
|
5
|
+
}
|
|
6
|
+
export interface MonthlyCost {
|
|
7
|
+
amount: number;
|
|
8
|
+
currency: string;
|
|
9
|
+
confidence: 'high' | 'medium' | 'low' | 'unknown';
|
|
10
|
+
assumptions: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface CostDelta {
|
|
13
|
+
totalDelta: number;
|
|
14
|
+
currency: string;
|
|
15
|
+
addedCosts: ResourceCost[];
|
|
16
|
+
removedCosts: ResourceCost[];
|
|
17
|
+
modifiedCosts: ModifiedResourceCost[];
|
|
18
|
+
}
|
|
19
|
+
export interface ResourceCost {
|
|
20
|
+
logicalId: string;
|
|
21
|
+
type: string;
|
|
22
|
+
monthlyCost: MonthlyCost;
|
|
23
|
+
}
|
|
24
|
+
export interface ModifiedResourceCost extends ResourceCost {
|
|
25
|
+
oldMonthlyCost: MonthlyCost;
|
|
26
|
+
newMonthlyCost: MonthlyCost;
|
|
27
|
+
costDelta: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ResourceCostCalculator {
|
|
30
|
+
supports(resourceType: string): boolean;
|
|
31
|
+
calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
|
|
32
|
+
}
|
|
33
|
+
export interface PricingClient {
|
|
34
|
+
getPrice(params: PriceQueryParams): Promise<number | null>;
|
|
35
|
+
}
|
|
36
|
+
export interface PriceQueryParams {
|
|
37
|
+
serviceCode: string;
|
|
38
|
+
region: string;
|
|
39
|
+
filters: PriceFilter[];
|
|
40
|
+
}
|
|
41
|
+
export interface PriceFilter {
|
|
42
|
+
field: string;
|
|
43
|
+
value: string;
|
|
44
|
+
type?: 'TERM_MATCH';
|
|
45
|
+
}
|
|
46
|
+
export declare class PricingAPIError extends Error {
|
|
47
|
+
retryable: boolean;
|
|
48
|
+
constructor(message: string, retryable?: boolean);
|
|
49
|
+
}
|
|
50
|
+
export declare class UnsupportedResourceError extends Error {
|
|
51
|
+
resourceType: string;
|
|
52
|
+
constructor(resourceType: string);
|
|
53
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnsupportedResourceError = exports.PricingAPIError = void 0;
|
|
4
|
+
class PricingAPIError extends Error {
|
|
5
|
+
retryable;
|
|
6
|
+
constructor(message, retryable = true) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.retryable = retryable;
|
|
9
|
+
this.name = 'PricingAPIError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.PricingAPIError = PricingAPIError;
|
|
13
|
+
class UnsupportedResourceError extends Error {
|
|
14
|
+
resourceType;
|
|
15
|
+
constructor(resourceType) {
|
|
16
|
+
super(`Resource type ${resourceType} is not supported`);
|
|
17
|
+
this.resourceType = resourceType;
|
|
18
|
+
this.name = 'UnsupportedResourceError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.UnsupportedResourceError = UnsupportedResourceError;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEyREEsTUFBYSxlQUFnQixTQUFRLEtBQUs7SUFDSjtJQUFwQyxZQUFZLE9BQWUsRUFBUyxZQUFxQixJQUFJO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURtQixjQUFTLEdBQVQsU0FBUyxDQUFnQjtRQUUzRCxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUxELDBDQUtDO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxLQUFLO0lBQzlCO0lBQW5CLFlBQW1CLFlBQW9CO1FBQ3JDLEtBQUssQ0FBQyxpQkFBaUIsWUFBWSxtQkFBbUIsQ0FBQyxDQUFDO1FBRHZDLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBRXJDLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBTEQsNERBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2luZ1NlcnZpY2Uge1xuICBnZXRSZXNvdXJjZUNvc3QocmVzb3VyY2U6IFJlc291cmNlV2l0aElkLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8TW9udGhseUNvc3Q+O1xuICBnZXRDb3N0RGVsdGEoZGlmZjogUmVzb3VyY2VEaWZmLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29zdERlbHRhPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aGx5Q29zdCB7XG4gIGFtb3VudDogbnVtYmVyO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBjb25maWRlbmNlOiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgJ3Vua25vd24nO1xuICBhc3N1bXB0aW9uczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29zdERlbHRhIHtcbiAgdG90YWxEZWx0YTogbnVtYmVyO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBhZGRlZENvc3RzOiBSZXNvdXJjZUNvc3RbXTtcbiAgcmVtb3ZlZENvc3RzOiBSZXNvdXJjZUNvc3RbXTtcbiAgbW9kaWZpZWRDb3N0czogTW9kaWZpZWRSZXNvdXJjZUNvc3RbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUNvc3Qge1xuICBsb2dpY2FsSWQ6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBtb250aGx5Q29zdDogTW9udGhseUNvc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZWRSZXNvdXJjZUNvc3QgZXh0ZW5kcyBSZXNvdXJjZUNvc3Qge1xuICBvbGRNb250aGx5Q29zdDogTW9udGhseUNvc3Q7XG4gIG5ld01vbnRobHlDb3N0OiBNb250aGx5Q29zdDtcbiAgY29zdERlbHRhOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIHN1cHBvcnRzKHJlc291cmNlVHlwZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgY2FsY3VsYXRlQ29zdChcbiAgICByZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nQ2xpZW50IHtcbiAgZ2V0UHJpY2UocGFyYW1zOiBQcmljZVF1ZXJ5UGFyYW1zKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljZVF1ZXJ5UGFyYW1zIHtcbiAgc2VydmljZUNvZGU6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGZpbHRlcnM6IFByaWNlRmlsdGVyW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2VGaWx0ZXIge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICB0eXBlPzogJ1RFUk1fTUFUQ0gnO1xufVxuXG5leHBvcnQgY2xhc3MgUHJpY2luZ0FQSUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyByZXRyeWFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1ByaWNpbmdBUElFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkUmVzb3VyY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlc291cmNlVHlwZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zdXBwb3J0ZWRSZXNvdXJjZUVycm9yJztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
v0.1.1
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Reporter as IReporter, ReportFormat, ReportOptions } from './types';
|
|
2
|
+
import { CostDelta } from '../pricing/types';
|
|
3
|
+
export declare class Reporter implements IReporter {
|
|
4
|
+
generateReport(costDelta: CostDelta, format: ReportFormat, options?: ReportOptions): string;
|
|
5
|
+
private generateTextReport;
|
|
6
|
+
private generateJsonReport;
|
|
7
|
+
private generateMarkdownReport;
|
|
8
|
+
private formatResourceLine;
|
|
9
|
+
private formatModifiedResourceLine;
|
|
10
|
+
private formatCurrency;
|
|
11
|
+
private formatDelta;
|
|
12
|
+
private formatConfigSummaryText;
|
|
13
|
+
private formatThresholdStatusText;
|
|
14
|
+
private formatConfigSummaryMarkdown;
|
|
15
|
+
private formatThresholdStatusMarkdown;
|
|
16
|
+
private getTopCostContributors;
|
|
17
|
+
private formatStackDetailsMarkdown;
|
|
18
|
+
}
|