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.
Files changed (89) hide show
  1. package/.cdk-cost-analyzer-cache/metadata.json +8 -8
  2. package/README.md +193 -3
  3. package/action.yml +50 -0
  4. package/dist/action/136.index.js +936 -0
  5. package/dist/action/360.index.js +93 -0
  6. package/dist/action/443.index.js +780 -0
  7. package/dist/action/566.index.js +387 -0
  8. package/dist/action/579.index.js +270 -0
  9. package/dist/action/605.index.js +234 -0
  10. package/dist/action/762.index.js +632 -0
  11. package/dist/action/869.index.js +531 -0
  12. package/dist/action/956.index.js +1072 -0
  13. package/dist/action/998.index.js +1418 -0
  14. package/dist/action/action/index.d.ts +7 -0
  15. package/dist/action/analysis/SingleTemplateAnalyzer.d.ts +23 -0
  16. package/dist/action/analysis/index.d.ts +1 -0
  17. package/dist/action/api/index.d.ts +35 -0
  18. package/dist/action/api/single-template-types.d.ts +83 -0
  19. package/dist/action/api/types.d.ts +15 -0
  20. package/dist/action/cli/index.d.ts +2 -0
  21. package/dist/action/config/ConfigManager.d.ts +40 -0
  22. package/dist/action/config/index.d.ts +2 -0
  23. package/dist/action/config/types.d.ts +153 -0
  24. package/dist/action/diff/DiffEngine.d.ts +7 -0
  25. package/dist/action/diff/index.d.ts +2 -0
  26. package/dist/action/diff/types.d.ts +20 -0
  27. package/dist/action/index.d.ts +8 -0
  28. package/dist/action/index.js +4 -0
  29. package/dist/action/integrations/GitHubIntegration.d.ts +43 -0
  30. package/dist/action/integrations/GitLabIntegration.d.ts +7 -0
  31. package/dist/action/integrations/index.d.ts +3 -0
  32. package/dist/action/integrations/types.d.ts +40 -0
  33. package/dist/action/parser/TemplateParser.d.ts +8 -0
  34. package/dist/action/parser/index.d.ts +2 -0
  35. package/dist/action/parser/types.d.ts +30 -0
  36. package/dist/action/pipeline/PipelineOrchestrator.d.ts +23 -0
  37. package/dist/action/pipeline/index.d.ts +2 -0
  38. package/dist/action/pipeline/types.d.ts +41 -0
  39. package/dist/action/pricing/CacheManager.d.ts +75 -0
  40. package/dist/action/pricing/PricingClient.d.ts +17 -0
  41. package/dist/action/pricing/PricingService.d.ts +16 -0
  42. package/dist/action/pricing/RegionMapper.d.ts +14 -0
  43. package/dist/action/pricing/calculators/ALBCalculator.d.ts +15 -0
  44. package/dist/action/pricing/calculators/APIGatewayCalculator.d.ts +9 -0
  45. package/dist/action/pricing/calculators/AutoScalingGroupCalculator.d.ts +9 -0
  46. package/dist/action/pricing/calculators/CloudFrontCalculator.d.ts +49 -0
  47. package/dist/action/pricing/calculators/DynamoDBCalculator.d.ts +12 -0
  48. package/dist/action/pricing/calculators/EC2Calculator.d.ts +6 -0
  49. package/dist/action/pricing/calculators/ECSCalculator.d.ts +8 -0
  50. package/dist/action/pricing/calculators/EFSCalculator.d.ts +19 -0
  51. package/dist/action/pricing/calculators/ElastiCacheCalculator.d.ts +7 -0
  52. package/dist/action/pricing/calculators/LambdaCalculator.d.ts +14 -0
  53. package/dist/action/pricing/calculators/LaunchTemplateCalculator.d.ts +35 -0
  54. package/dist/action/pricing/calculators/NLBCalculator.d.ts +15 -0
  55. package/dist/action/pricing/calculators/NatGatewayCalculator.d.ts +10 -0
  56. package/dist/action/pricing/calculators/RDSCalculator.d.ts +8 -0
  57. package/dist/action/pricing/calculators/S3Calculator.d.ts +7 -0
  58. package/dist/action/pricing/calculators/SNSCalculator.d.ts +54 -0
  59. package/dist/action/pricing/calculators/SQSCalculator.d.ts +16 -0
  60. package/dist/action/pricing/calculators/SecretsManagerCalculator.d.ts +21 -0
  61. package/dist/action/pricing/calculators/StepFunctionsCalculator.d.ts +23 -0
  62. package/dist/action/pricing/calculators/VPCEndpointCalculator.d.ts +10 -0
  63. package/dist/action/pricing/index.d.ts +16 -0
  64. package/dist/action/pricing/types.d.ts +54 -0
  65. package/dist/action/reporter/GitHubActionReporter.d.ts +42 -0
  66. package/dist/action/reporter/Reporter.d.ts +18 -0
  67. package/dist/action/reporter/SingleTemplateReporter.d.ts +31 -0
  68. package/dist/action/reporter/index.d.ts +4 -0
  69. package/dist/action/reporter/types.d.ts +72 -0
  70. package/dist/action/synthesis/SynthesisOrchestrator.d.ts +26 -0
  71. package/dist/action/synthesis/index.d.ts +2 -0
  72. package/dist/action/synthesis/types.d.ts +17 -0
  73. package/dist/action/threshold/ThresholdEnforcer.d.ts +29 -0
  74. package/dist/action/threshold/index.d.ts +2 -0
  75. package/dist/action/threshold/types.d.ts +15 -0
  76. package/dist/action/utils/Logger.d.ts +39 -0
  77. package/dist/cli/index.js +56 -1
  78. package/dist/integrations/GitHubIntegration.d.ts +43 -0
  79. package/dist/integrations/GitHubIntegration.js +217 -0
  80. package/dist/integrations/index.d.ts +1 -0
  81. package/dist/integrations/index.js +4 -2
  82. package/dist/integrations/types.d.ts +29 -0
  83. package/dist/integrations/types.js +11 -2
  84. package/dist/releasetag.txt +1 -1
  85. package/dist/reporter/GitHubActionReporter.d.ts +42 -0
  86. package/dist/reporter/GitHubActionReporter.js +161 -0
  87. package/dist/reporter/index.d.ts +1 -0
  88. package/dist/reporter/index.js +4 -2
  89. 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=
@@ -1,3 +1,4 @@
1
1
  export { Reporter } from './Reporter';
2
2
  export { SingleTemplateReporter } from './SingleTemplateReporter';
3
+ export { GitHubActionReporter } from './GitHubActionReporter';
3
4
  export * from './types';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBc0M7QUFBN0Isb0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1FQUFrRTtBQUF6RCxnSUFBQSxzQkFBc0IsT0FBQTtBQUMvQiwwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBSZXBvcnRlciB9IGZyb20gJy4vUmVwb3J0ZXInO1xuZXhwb3J0IHsgU2luZ2xlVGVtcGxhdGVSZXBvcnRlciB9IGZyb20gJy4vU2luZ2xlVGVtcGxhdGVSZXBvcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
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.35",
90
+ "version": "0.1.37",
87
91
  "bugs": {
88
92
  "url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
89
93
  },