cdk-cost-analyzer 0.1.35 → 0.1.37
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 +8 -8
- package/README.md +193 -3
- package/action.yml +50 -0
- package/dist/action/136.index.js +936 -0
- package/dist/action/360.index.js +93 -0
- package/dist/action/443.index.js +780 -0
- package/dist/action/566.index.js +387 -0
- package/dist/action/579.index.js +270 -0
- package/dist/action/605.index.js +234 -0
- package/dist/action/762.index.js +632 -0
- package/dist/action/869.index.js +531 -0
- package/dist/action/956.index.js +1072 -0
- package/dist/action/998.index.js +1418 -0
- package/dist/action/action/index.d.ts +7 -0
- package/dist/action/analysis/SingleTemplateAnalyzer.d.ts +23 -0
- package/dist/action/analysis/index.d.ts +1 -0
- package/dist/action/api/index.d.ts +35 -0
- package/dist/action/api/single-template-types.d.ts +83 -0
- package/dist/action/api/types.d.ts +15 -0
- package/dist/action/cli/index.d.ts +2 -0
- package/dist/action/config/ConfigManager.d.ts +40 -0
- package/dist/action/config/index.d.ts +2 -0
- package/dist/action/config/types.d.ts +153 -0
- package/dist/action/diff/DiffEngine.d.ts +7 -0
- package/dist/action/diff/index.d.ts +2 -0
- package/dist/action/diff/types.d.ts +20 -0
- package/dist/action/index.d.ts +8 -0
- package/dist/action/index.js +4 -0
- package/dist/action/integrations/GitHubIntegration.d.ts +43 -0
- package/dist/action/integrations/GitLabIntegration.d.ts +7 -0
- package/dist/action/integrations/index.d.ts +3 -0
- package/dist/action/integrations/types.d.ts +40 -0
- package/dist/action/parser/TemplateParser.d.ts +8 -0
- package/dist/action/parser/index.d.ts +2 -0
- package/dist/action/parser/types.d.ts +30 -0
- package/dist/action/pipeline/PipelineOrchestrator.d.ts +23 -0
- package/dist/action/pipeline/index.d.ts +2 -0
- package/dist/action/pipeline/types.d.ts +41 -0
- package/dist/action/pricing/CacheManager.d.ts +75 -0
- package/dist/action/pricing/PricingClient.d.ts +17 -0
- package/dist/action/pricing/PricingService.d.ts +16 -0
- package/dist/action/pricing/RegionMapper.d.ts +14 -0
- package/dist/action/pricing/calculators/ALBCalculator.d.ts +15 -0
- package/dist/action/pricing/calculators/APIGatewayCalculator.d.ts +9 -0
- package/dist/action/pricing/calculators/AutoScalingGroupCalculator.d.ts +9 -0
- package/dist/action/pricing/calculators/CloudFrontCalculator.d.ts +49 -0
- package/dist/action/pricing/calculators/DynamoDBCalculator.d.ts +12 -0
- package/dist/action/pricing/calculators/EC2Calculator.d.ts +6 -0
- package/dist/action/pricing/calculators/ECSCalculator.d.ts +8 -0
- package/dist/action/pricing/calculators/EFSCalculator.d.ts +19 -0
- package/dist/action/pricing/calculators/ElastiCacheCalculator.d.ts +7 -0
- package/dist/action/pricing/calculators/LambdaCalculator.d.ts +14 -0
- package/dist/action/pricing/calculators/LaunchTemplateCalculator.d.ts +35 -0
- package/dist/action/pricing/calculators/NLBCalculator.d.ts +15 -0
- package/dist/action/pricing/calculators/NatGatewayCalculator.d.ts +10 -0
- package/dist/action/pricing/calculators/RDSCalculator.d.ts +8 -0
- package/dist/action/pricing/calculators/S3Calculator.d.ts +7 -0
- package/dist/action/pricing/calculators/SNSCalculator.d.ts +54 -0
- package/dist/action/pricing/calculators/SQSCalculator.d.ts +16 -0
- package/dist/action/pricing/calculators/SecretsManagerCalculator.d.ts +21 -0
- package/dist/action/pricing/calculators/StepFunctionsCalculator.d.ts +23 -0
- package/dist/action/pricing/calculators/VPCEndpointCalculator.d.ts +10 -0
- package/dist/action/pricing/index.d.ts +16 -0
- package/dist/action/pricing/types.d.ts +54 -0
- package/dist/action/reporter/GitHubActionReporter.d.ts +42 -0
- package/dist/action/reporter/Reporter.d.ts +18 -0
- package/dist/action/reporter/SingleTemplateReporter.d.ts +31 -0
- package/dist/action/reporter/index.d.ts +4 -0
- package/dist/action/reporter/types.d.ts +72 -0
- package/dist/action/synthesis/SynthesisOrchestrator.d.ts +26 -0
- package/dist/action/synthesis/index.d.ts +2 -0
- package/dist/action/synthesis/types.d.ts +17 -0
- package/dist/action/threshold/ThresholdEnforcer.d.ts +29 -0
- package/dist/action/threshold/index.d.ts +2 -0
- package/dist/action/threshold/types.d.ts +15 -0
- package/dist/action/utils/Logger.d.ts +39 -0
- package/dist/cli/index.js +56 -1
- package/dist/integrations/GitHubIntegration.d.ts +43 -0
- package/dist/integrations/GitHubIntegration.js +217 -0
- package/dist/integrations/index.d.ts +1 -0
- package/dist/integrations/index.js +4 -2
- package/dist/integrations/types.d.ts +29 -0
- package/dist/integrations/types.js +11 -2
- package/dist/releasetag.txt +1 -1
- package/dist/reporter/GitHubActionReporter.d.ts +42 -0
- package/dist/reporter/GitHubActionReporter.js +161 -0
- package/dist/reporter/index.d.ts +1 -0
- package/dist/reporter/index.js +4 -2
- package/package.json +5 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CostDelta } from '../pricing/types';
|
|
2
|
+
/**
|
|
3
|
+
* Format cost delta for GitHub Action PR comments with trend indicators.
|
|
4
|
+
*/
|
|
5
|
+
export declare class GitHubActionReporter {
|
|
6
|
+
/**
|
|
7
|
+
* Generate a formatted markdown report for GitHub PR comments.
|
|
8
|
+
*/
|
|
9
|
+
generateReport(costDelta: CostDelta, baseCost?: number, targetCost?: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* Generate cost impact summary with percentage change.
|
|
12
|
+
*/
|
|
13
|
+
private generateCostSummary;
|
|
14
|
+
/**
|
|
15
|
+
* Format added resources table.
|
|
16
|
+
*/
|
|
17
|
+
private formatAddedResources;
|
|
18
|
+
/**
|
|
19
|
+
* Format modified resources table.
|
|
20
|
+
*/
|
|
21
|
+
private formatModifiedResources;
|
|
22
|
+
/**
|
|
23
|
+
* Format removed resources table.
|
|
24
|
+
*/
|
|
25
|
+
private formatRemovedResources;
|
|
26
|
+
/**
|
|
27
|
+
* Get trend indicator emoji based on cost delta.
|
|
28
|
+
*/
|
|
29
|
+
private getTrendIndicator;
|
|
30
|
+
/**
|
|
31
|
+
* Format currency value.
|
|
32
|
+
*/
|
|
33
|
+
private formatCurrency;
|
|
34
|
+
/**
|
|
35
|
+
* Format cost delta with sign.
|
|
36
|
+
*/
|
|
37
|
+
private formatDelta;
|
|
38
|
+
/**
|
|
39
|
+
* Format percentage with sign.
|
|
40
|
+
*/
|
|
41
|
+
private formatPercentage;
|
|
42
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitHubActionReporter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Format cost delta for GitHub Action PR comments with trend indicators.
|
|
6
|
+
*/
|
|
7
|
+
class GitHubActionReporter {
|
|
8
|
+
/**
|
|
9
|
+
* Generate a formatted markdown report for GitHub PR comments.
|
|
10
|
+
*/
|
|
11
|
+
generateReport(costDelta, baseCost, targetCost) {
|
|
12
|
+
const lines = [];
|
|
13
|
+
lines.push('## 💰 CDK Cost Analysis');
|
|
14
|
+
lines.push('');
|
|
15
|
+
// Cost impact summary
|
|
16
|
+
lines.push(this.generateCostSummary(costDelta, baseCost, targetCost));
|
|
17
|
+
lines.push('');
|
|
18
|
+
// Resource changes
|
|
19
|
+
if (costDelta.addedCosts.length > 0) {
|
|
20
|
+
lines.push(this.formatAddedResources(costDelta.addedCosts, costDelta.currency));
|
|
21
|
+
lines.push('');
|
|
22
|
+
}
|
|
23
|
+
if (costDelta.modifiedCosts.length > 0) {
|
|
24
|
+
lines.push(this.formatModifiedResources(costDelta.modifiedCosts, costDelta.currency));
|
|
25
|
+
lines.push('');
|
|
26
|
+
}
|
|
27
|
+
if (costDelta.removedCosts.length > 0) {
|
|
28
|
+
lines.push(this.formatRemovedResources(costDelta.removedCosts, costDelta.currency));
|
|
29
|
+
lines.push('');
|
|
30
|
+
}
|
|
31
|
+
if (costDelta.addedCosts.length === 0 &&
|
|
32
|
+
costDelta.removedCosts.length === 0 &&
|
|
33
|
+
costDelta.modifiedCosts.length === 0) {
|
|
34
|
+
lines.push('No resource changes detected.');
|
|
35
|
+
lines.push('');
|
|
36
|
+
}
|
|
37
|
+
// Attribution footer
|
|
38
|
+
lines.push('---');
|
|
39
|
+
lines.push('*Generated by [cdk-cost-analyzer](https://github.com/buildinginthecloud/cdk-cost-analyzer)*');
|
|
40
|
+
return lines.join('\n');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate cost impact summary with percentage change.
|
|
44
|
+
*/
|
|
45
|
+
generateCostSummary(costDelta, baseCost, targetCost) {
|
|
46
|
+
const lines = [];
|
|
47
|
+
const trendIndicator = this.getTrendIndicator(costDelta.totalDelta);
|
|
48
|
+
const deltaFormatted = this.formatDelta(costDelta.totalDelta, costDelta.currency);
|
|
49
|
+
lines.push(`**Monthly Cost Impact:** ${trendIndicator} ${deltaFormatted}`);
|
|
50
|
+
// Add percentage change if we have base/target costs
|
|
51
|
+
if (baseCost !== undefined && targetCost !== undefined && baseCost > 0) {
|
|
52
|
+
const percentageChange = ((targetCost - baseCost) / baseCost) * 100;
|
|
53
|
+
const percentFormatted = this.formatPercentage(percentageChange);
|
|
54
|
+
lines.push(`**Percentage Change:** ${percentFormatted}`);
|
|
55
|
+
}
|
|
56
|
+
// Add base/target cost breakdown if available
|
|
57
|
+
if (baseCost !== undefined && targetCost !== undefined) {
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('| Metric | Value |');
|
|
60
|
+
lines.push('|--------|-------|');
|
|
61
|
+
lines.push(`| Base Monthly Cost | ${this.formatCurrency(baseCost, costDelta.currency)} |`);
|
|
62
|
+
lines.push(`| Target Monthly Cost | ${this.formatCurrency(targetCost, costDelta.currency)} |`);
|
|
63
|
+
lines.push(`| Cost Delta | ${deltaFormatted} |`);
|
|
64
|
+
}
|
|
65
|
+
return lines.join('\n');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format added resources table.
|
|
69
|
+
*/
|
|
70
|
+
formatAddedResources(resources, currency) {
|
|
71
|
+
const lines = [];
|
|
72
|
+
lines.push('### ➕ Added Resources');
|
|
73
|
+
lines.push('');
|
|
74
|
+
lines.push('| Logical ID | Type | Monthly Cost |');
|
|
75
|
+
lines.push('|------------|------|--------------|');
|
|
76
|
+
const sorted = [...resources].sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount);
|
|
77
|
+
for (const resource of sorted) {
|
|
78
|
+
lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ${this.formatCurrency(resource.monthlyCost.amount, currency)} |`);
|
|
79
|
+
}
|
|
80
|
+
const total = resources.reduce((sum, r) => sum + r.monthlyCost.amount, 0);
|
|
81
|
+
lines.push(`| **Total Added** | | **${this.formatCurrency(total, currency)}** |`);
|
|
82
|
+
return lines.join('\n');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Format modified resources table.
|
|
86
|
+
*/
|
|
87
|
+
formatModifiedResources(resources, currency) {
|
|
88
|
+
const lines = [];
|
|
89
|
+
lines.push('### 🔄 Modified Resources');
|
|
90
|
+
lines.push('');
|
|
91
|
+
lines.push('| Logical ID | Type | Old Cost | New Cost | Delta |');
|
|
92
|
+
lines.push('|------------|------|----------|----------|-------|');
|
|
93
|
+
const sorted = [...resources].sort((a, b) => Math.abs(b.costDelta) - Math.abs(a.costDelta));
|
|
94
|
+
for (const resource of sorted) {
|
|
95
|
+
const trendIndicator = this.getTrendIndicator(resource.costDelta);
|
|
96
|
+
lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ` +
|
|
97
|
+
`${this.formatCurrency(resource.oldMonthlyCost.amount, currency)} | ` +
|
|
98
|
+
`${this.formatCurrency(resource.newMonthlyCost.amount, currency)} | ` +
|
|
99
|
+
`${trendIndicator} ${this.formatDelta(resource.costDelta, currency)} |`);
|
|
100
|
+
}
|
|
101
|
+
const totalDelta = resources.reduce((sum, r) => sum + r.costDelta, 0);
|
|
102
|
+
const totalTrend = this.getTrendIndicator(totalDelta);
|
|
103
|
+
lines.push(`| **Total Modified** | | | | **${totalTrend} ${this.formatDelta(totalDelta, currency)}** |`);
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Format removed resources table.
|
|
108
|
+
*/
|
|
109
|
+
formatRemovedResources(resources, currency) {
|
|
110
|
+
const lines = [];
|
|
111
|
+
lines.push('### ➖ Removed Resources');
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push('| Logical ID | Type | Monthly Cost |');
|
|
114
|
+
lines.push('|------------|------|--------------|');
|
|
115
|
+
const sorted = [...resources].sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount);
|
|
116
|
+
for (const resource of sorted) {
|
|
117
|
+
lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ${this.formatCurrency(resource.monthlyCost.amount, currency)} |`);
|
|
118
|
+
}
|
|
119
|
+
const total = resources.reduce((sum, r) => sum + r.monthlyCost.amount, 0);
|
|
120
|
+
lines.push(`| **Total Removed** | | **-${this.formatCurrency(total, currency)}** |`);
|
|
121
|
+
return lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get trend indicator emoji based on cost delta.
|
|
125
|
+
*/
|
|
126
|
+
getTrendIndicator(delta) {
|
|
127
|
+
if (delta > 0) {
|
|
128
|
+
return '↗️';
|
|
129
|
+
}
|
|
130
|
+
else if (delta < 0) {
|
|
131
|
+
return '↘️';
|
|
132
|
+
}
|
|
133
|
+
return '➡️';
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Format currency value.
|
|
137
|
+
*/
|
|
138
|
+
formatCurrency(amount, currency) {
|
|
139
|
+
const symbol = currency === 'USD' ? '$' : currency;
|
|
140
|
+
return `${symbol}${amount.toFixed(2)}`;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Format cost delta with sign.
|
|
144
|
+
*/
|
|
145
|
+
formatDelta(amount, currency) {
|
|
146
|
+
const formatted = this.formatCurrency(Math.abs(amount), currency);
|
|
147
|
+
if (amount === 0) {
|
|
148
|
+
return formatted;
|
|
149
|
+
}
|
|
150
|
+
return amount < 0 ? `-${formatted}` : `+${formatted}`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Format percentage with sign.
|
|
154
|
+
*/
|
|
155
|
+
formatPercentage(percentage) {
|
|
156
|
+
const sign = percentage > 0 ? '+' : '';
|
|
157
|
+
return `${sign}${percentage.toFixed(1)}%`;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.GitHubActionReporter = GitHubActionReporter;
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQWN0aW9uUmVwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvR2l0SHViQWN0aW9uUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7O0dBRUc7QUFDSCxNQUFhLG9CQUFvQjtJQUMvQjs7T0FFRztJQUNILGNBQWMsQ0FDWixTQUFvQixFQUNwQixRQUFpQixFQUNqQixVQUFtQjtRQUVuQixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFZixzQkFBc0I7UUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFZixtQkFBbUI7UUFDbkIsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVELElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0RixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FB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TUFBTSxJQUFJLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsT0FBTyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBak5ELG9EQWlOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvc3REZWx0YSwgUmVzb3VyY2VDb3N0LCBNb2RpZmllZFJlc291cmNlQ29zdCB9IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuXG4vKipcbiAqIEZvcm1hdCBjb3N0IGRlbHRhIGZvciBHaXRIdWIgQWN0aW9uIFBSIGNvbW1lbnRzIHdpdGggdHJlbmQgaW5kaWNhdG9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YkFjdGlvblJlcG9ydGVyIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgZm9ybWF0dGVkIG1hcmtkb3duIHJlcG9ydCBmb3IgR2l0SHViIFBSIGNvbW1lbnRzLlxuICAgKi9cbiAgZ2VuZXJhdGVSZXBvcnQoXG4gICAgY29zdERlbHRhOiBDb3N0RGVsdGEsXG4gICAgYmFzZUNvc3Q/OiBudW1iZXIsXG4gICAgdGFyZ2V0Q29zdD86IG51bWJlcixcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJyMjIPCfkrAgQ0RLIENvc3QgQW5hbHlzaXMnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIENvc3QgaW1wYWN0IHN1bW1hcnlcbiAgICBsaW5lcy5wdXNoKHRoaXMuZ2VuZXJhdGVDb3N0U3VtbWFyeShjb3N0RGVsdGEsIGJhc2VDb3N0LCB0YXJnZXRDb3N0KSk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBSZXNvdXJjZSBjaGFuZ2VzXG4gICAgaWYgKGNvc3REZWx0YS5hZGRlZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2godGhpcy5mb3JtYXRBZGRlZFJlc291cmNlcyhjb3N0RGVsdGEuYWRkZWRDb3N0cywgY29zdERlbHRhLmN1cnJlbmN5KSk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCh0aGlzLmZvcm1hdE1vZGlmaWVkUmVzb3VyY2VzKGNvc3REZWx0YS5tb2RpZmllZENvc3RzLCBjb3N0RGVsdGEuY3VycmVuY3kpKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2godGhpcy5mb3JtYXRSZW1vdmVkUmVzb3VyY2VzKGNvc3REZWx0YS5yZW1vdmVkQ29zdHMsIGNvc3REZWx0YS5jdXJyZW5jeSkpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID09PSAwICYmXG4gICAgICBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCdObyByZXNvdXJjZSBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gQXR0cmlidXRpb24gZm9vdGVyXG4gICAgbGluZXMucHVzaCgnLS0tJyk7XG4gICAgbGluZXMucHVzaCgnKkdlbmVyYXRlZCBieSBbY2RrLWNvc3QtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWlsZGluZ2ludGhlY2xvdWQvY2RrLWNvc3QtYW5hbHl6ZXIpKicpO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGNvc3QgaW1wYWN0IHN1bW1hcnkgd2l0aCBwZXJjZW50YWdlIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDb3N0U3VtbWFyeShcbiAgICBjb3N0RGVsdGE6IENvc3REZWx0YSxcbiAgICBiYXNlQ29zdD86IG51bWJlcixcbiAgICB0YXJnZXRDb3N0PzogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgdHJlbmRJbmRpY2F0b3IgPSB0aGlzLmdldFRyZW5kSW5kaWNhdG9yKGNvc3REZWx0YS50b3RhbERlbHRhKTtcbiAgICBjb25zdCBkZWx0YUZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0RGVsdGEoY29zdERlbHRhLnRvdGFsRGVsdGEsIGNvc3REZWx0YS5jdXJyZW5jeSk7XG5cbiAgICBsaW5lcy5wdXNoKGAqKk1vbnRobHkgQ29zdCBJbXBhY3Q6KiogJHt0cmVuZEluZGljYXRvcn0gJHtkZWx0YUZvcm1hdHRlZH1gKTtcblxuICAgIC8vIEFkZCBwZXJjZW50YWdlIGNoYW5nZSBpZiB3ZSBoYXZlIGJhc2UvdGFyZ2V0IGNvc3RzXG4gICAgaWYgKGJhc2VDb3N0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0Q29zdCAhPT0gdW5kZWZpbmVkICYmIGJhc2VDb3N0ID4gMCkge1xuICAgICAgY29uc3QgcGVyY2VudGFnZUNoYW5nZSA9ICgodGFyZ2V0Q29zdCAtIGJhc2VDb3N0KSAvIGJhc2VDb3N0KSAqIDEwMDtcbiAgICAgIGNvbnN0IHBlcmNlbnRGb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdFBlcmNlbnRhZ2UocGVyY2VudGFnZUNoYW5nZSk7XG4gICAgICBsaW5lcy5wdXNoKGAqKlBlcmNlbnRhZ2UgQ2hhbmdlOioqICR7cGVyY2VudEZvcm1hdHRlZH1gKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgYmFzZS90YXJnZXQgY29zdCBicmVha2Rvd24gaWYgYXZhaWxhYmxlXG4gICAgaWYgKGJhc2VDb3N0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0Q29zdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wgTWV0cmljIHwgVmFsdWUgfCcpO1xuICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS0tfC0tLS0tLS18Jyk7XG4gICAgICBsaW5lcy5wdXNoKGB8IEJhc2UgTW9udGhseSBDb3N0IHwgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KGJhc2VDb3N0LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCk7XG4gICAgICBsaW5lcy5wdXNoKGB8IFRhcmdldCBNb250aGx5IENvc3QgfCAke3RoaXMuZm9ybWF0Q3VycmVuY3kodGFyZ2V0Q29zdCwgY29zdERlbHRhLmN1cnJlbmN5KX0gfGApO1xuICAgICAgbGluZXMucHVzaChgfCBDb3N0IERlbHRhIHwgJHtkZWx0YUZvcm1hdHRlZH0gfGApO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYWRkZWQgcmVzb3VyY2VzIHRhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRBZGRlZFJlc291cmNlcyhyZXNvdXJjZXM6IFJlc291cmNlQ29zdFtdLCBjdXJyZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJyMjIyDinpUgQWRkZWQgUmVzb3VyY2VzJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaCgnfCBMb2dpY2FsIElEIHwgVHlwZSB8IE1vbnRobHkgQ29zdCB8Jyk7XG4gICAgbGluZXMucHVzaCgnfC0tLS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS18Jyk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzb3VyY2VzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgfCAke3Jlc291cmNlLmxvZ2ljYWxJZH0gfCBcXGAke3Jlc291cmNlLnR5cGV9XFxgIHwgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudCwgY3VycmVuY3kpfSB8YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWwgPSByZXNvdXJjZXMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIubW9udGhseUNvc3QuYW1vdW50LCAwKTtcbiAgICBsaW5lcy5wdXNoKGB8ICoqVG90YWwgQWRkZWQqKiB8IHwgKioke3RoaXMuZm9ybWF0Q3VycmVuY3kodG90YWwsIGN1cnJlbmN5KX0qKiB8YCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IG1vZGlmaWVkIHJlc291cmNlcyB0YWJsZS5cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TW9kaWZpZWRSZXNvdXJjZXMocmVzb3VyY2VzOiBNb2RpZmllZFJlc291cmNlQ29zdFtdLCBjdXJyZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJyMjIyDwn5SEIE1vZGlmaWVkIFJlc291cmNlcycpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goJ3wgTG9naWNhbCBJRCB8IFR5cGUgfCBPbGQgQ29zdCB8IE5ldyBDb3N0IHwgRGVsdGEgfCcpO1xuICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tfCcpO1xuXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLnJlc291cmNlc10uc29ydChcbiAgICAgIChhLCBiKSA9PiBNYXRoLmFicyhiLmNvc3REZWx0YSkgLSBNYXRoLmFicyhhLmNvc3REZWx0YSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkKSB7XG4gICAgICBjb25zdCB0cmVuZEluZGljYXRvciA9IHRoaXMuZ2V0VHJlbmRJbmRpY2F0b3IocmVzb3VyY2UuY29zdERlbHRhKTtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGB8ICR7cmVzb3VyY2UubG9naWNhbElkfSB8IFxcYCR7cmVzb3VyY2UudHlwZX1cXGAgfCBgICtcbiAgICAgICAgYCR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5vbGRNb250aGx5Q29zdC5hbW91bnQsIGN1cnJlbmN5KX0gfCBgICtcbiAgICAgICAgYCR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5uZXdNb250aGx5Q29zdC5hbW91bnQsIGN1cnJlbmN5KX0gfCBgICtcbiAgICAgICAgYCR7dHJlbmRJbmRpY2F0b3J9ICR7dGhpcy5mb3JtYXREZWx0YShyZXNvdXJjZS5jb3N0RGVsdGEsIGN1cnJlbmN5KX0gfGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSByZXNvdXJjZXMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcbiAgICBjb25zdCB0b3RhbFRyZW5kID0gdGhpcy5nZXRUcmVuZEluZGljYXRvcih0b3RhbERlbHRhKTtcbiAgICBsaW5lcy5wdXNoKGB8ICoqVG90YWwgTW9kaWZpZWQqKiB8IHwgfCB8ICoqJHt0b3RhbFRyZW5kfSAke3RoaXMuZm9ybWF0RGVsdGEodG90YWxEZWx0YSwgY3VycmVuY3kpfSoqIHxgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgcmVtb3ZlZCByZXNvdXJjZXMgdGFibGUuXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFJlbW92ZWRSZXNvdXJjZXMocmVzb3VyY2VzOiBSZXNvdXJjZUNvc3RbXSwgY3VycmVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCcjIyMg4p6WIFJlbW92ZWQgUmVzb3VyY2VzJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaCgnfCBMb2dpY2FsIElEIHwgVHlwZSB8IE1vbnRobHkgQ29zdCB8Jyk7XG4gICAgbGluZXMucHVzaCgnfC0tLS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS18Jyk7XG5cbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzb3VyY2VzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgfCAke3Jlc291cmNlLmxvZ2ljYWxJZH0gfCBcXGAke3Jlc291cmNlLnR5cGV9XFxgIHwgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudCwgY3VycmVuY3kpfSB8YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWwgPSByZXNvdXJjZXMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIubW9udGhseUNvc3QuYW1vdW50LCAwKTtcbiAgICBsaW5lcy5wdXNoKGB8ICoqVG90YWwgUmVtb3ZlZCoqIHwgfCAqKi0ke3RoaXMuZm9ybWF0Q3VycmVuY3kodG90YWwsIGN1cnJlbmN5KX0qKiB8YCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyZW5kIGluZGljYXRvciBlbW9qaSBiYXNlZCBvbiBjb3N0IGRlbHRhLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmVuZEluZGljYXRvcihkZWx0YTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICByZXR1cm4gJ+KGl++4jyc7XG4gICAgfSBlbHNlIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIHJldHVybiAn4oaY77iPJztcbiAgICB9XG4gICAgcmV0dXJuICfinqHvuI8nO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBjdXJyZW5jeSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0Q3VycmVuY3koYW1vdW50OiBudW1iZXIsIGN1cnJlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN5bWJvbCA9IGN1cnJlbmN5ID09PSAnVVNEJyA/ICckJyA6IGN1cnJlbmN5O1xuICAgIHJldHVybiBgJHtzeW1ib2x9JHthbW91bnQudG9GaXhlZCgyKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBjb3N0IGRlbHRhIHdpdGggc2lnbi5cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RGVsdGEoYW1vdW50OiBudW1iZXIsIGN1cnJlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0Q3VycmVuY3koTWF0aC5hYnMoYW1vdW50KSwgY3VycmVuY3kpO1xuICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBmb3JtYXR0ZWQ7XG4gICAgfVxuICAgIHJldHVybiBhbW91bnQgPCAwID8gYC0ke2Zvcm1hdHRlZH1gIDogYCske2Zvcm1hdHRlZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBwZXJjZW50YWdlIHdpdGggc2lnbi5cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0UGVyY2VudGFnZShwZXJjZW50YWdlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ24gPSBwZXJjZW50YWdlID4gMCA/ICcrJyA6ICcnO1xuICAgIHJldHVybiBgJHtzaWdufSR7cGVyY2VudGFnZS50b0ZpeGVkKDEpfSVgO1xuICB9XG59XG4iXX0=
|
package/dist/reporter/index.d.ts
CHANGED
package/dist/reporter/index.js
CHANGED
|
@@ -14,10 +14,12 @@ 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.SingleTemplateReporter = exports.Reporter = void 0;
|
|
17
|
+
exports.GitHubActionReporter = exports.SingleTemplateReporter = exports.Reporter = void 0;
|
|
18
18
|
var Reporter_1 = require("./Reporter");
|
|
19
19
|
Object.defineProperty(exports, "Reporter", { enumerable: true, get: function () { return Reporter_1.Reporter; } });
|
|
20
20
|
var SingleTemplateReporter_1 = require("./SingleTemplateReporter");
|
|
21
21
|
Object.defineProperty(exports, "SingleTemplateReporter", { enumerable: true, get: function () { return SingleTemplateReporter_1.SingleTemplateReporter; } });
|
|
22
|
+
var GitHubActionReporter_1 = require("./GitHubActionReporter");
|
|
23
|
+
Object.defineProperty(exports, "GitHubActionReporter", { enumerable: true, get: function () { return GitHubActionReporter_1.GitHubActionReporter; } });
|
|
22
24
|
__exportStar(require("./types"), exports);
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBc0M7QUFBN0Isb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1FQUFrRTtBQUF6RCxnSUFBQSxzQkFBc0IsT0FBQTtBQUMvQiwrREFBOEQ7QUFBckQsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgUmVwb3J0ZXIgfSBmcm9tICcuL1JlcG9ydGVyJztcbmV4cG9ydCB7IFNpbmdsZVRlbXBsYXRlUmVwb3J0ZXIgfSBmcm9tICcuL1NpbmdsZVRlbXBsYXRlUmVwb3J0ZXInO1xuZXhwb3J0IHsgR2l0SHViQWN0aW9uUmVwb3J0ZXIgfSBmcm9tICcuL0dpdEh1YkFjdGlvblJlcG9ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
|
package/package.json
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "npx projen build",
|
|
13
|
+
"build:action": "npx projen build:action",
|
|
13
14
|
"bump": "npx projen bump",
|
|
14
15
|
"ci:local": "npx projen ci:local",
|
|
15
16
|
"clobber": "npx projen clobber",
|
|
@@ -47,6 +48,7 @@
|
|
|
47
48
|
"@types/node": "^22.10.1",
|
|
48
49
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
49
50
|
"@typescript-eslint/parser": "^8",
|
|
51
|
+
"@vercel/ncc": "^0.38.1",
|
|
50
52
|
"commit-and-tag-version": "^12",
|
|
51
53
|
"constructs": "^10.0.0",
|
|
52
54
|
"eslint": "^9",
|
|
@@ -63,6 +65,8 @@
|
|
|
63
65
|
"typescript": "^5.9.3"
|
|
64
66
|
},
|
|
65
67
|
"dependencies": {
|
|
68
|
+
"@actions/core": "^1.10.1",
|
|
69
|
+
"@actions/github": "^6.0.0",
|
|
66
70
|
"@aws-sdk/client-pricing": "^3.705.0",
|
|
67
71
|
"commander": "^12.1.0",
|
|
68
72
|
"js-yaml": "^4.1.0"
|
|
@@ -83,7 +87,7 @@
|
|
|
83
87
|
"publishConfig": {
|
|
84
88
|
"access": "public"
|
|
85
89
|
},
|
|
86
|
-
"version": "0.1.
|
|
90
|
+
"version": "0.1.37",
|
|
87
91
|
"bugs": {
|
|
88
92
|
"url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
|
|
89
93
|
},
|