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.
Files changed (228) hide show
  1. package/.cdk-cost-analyzer-cache/metadata.json +12 -0
  2. package/.gitlab-ci.yml +214 -0
  3. package/.husky/pre-commit +12 -0
  4. package/.kiro/hooks/accessibility-audit.kiro.hook +18 -0
  5. package/.kiro/hooks/api-schema-validation.kiro.hook +21 -0
  6. package/.kiro/hooks/auto-test-on-save.kiro.hook +19 -0
  7. package/.kiro/hooks/cdk-synth-on-change.kiro.hook +20 -0
  8. package/.kiro/hooks/code-coverage-check.kiro.hook +14 -0
  9. package/.kiro/hooks/commit-message-helper.kiro.hook +14 -0
  10. package/.kiro/hooks/dependency-update-check.kiro.hook +14 -0
  11. package/.kiro/hooks/env-file-validation.kiro.hook +18 -0
  12. package/.kiro/hooks/lint-and-format-on-save.kiro.hook +21 -0
  13. package/.kiro/hooks/mcp-config-validation.kiro.hook +17 -0
  14. package/.kiro/hooks/mcp-server-test.kiro.hook +14 -0
  15. package/.kiro/hooks/performance-analysis.kiro.hook +14 -0
  16. package/.kiro/hooks/readme-spell-check.kiro.hook +14 -0
  17. package/.kiro/hooks/security-scan-on-dependency-change.kiro.hook +21 -0
  18. package/.kiro/hooks/translation-update.kiro.hook +18 -0
  19. package/.kiro/hooks/update-documentation.kiro.hook +18 -0
  20. package/.kiro/settings/mcp.json +20 -0
  21. package/.kiro/specs/cdk-cost-analyzer/design.md +620 -0
  22. package/.kiro/specs/cdk-cost-analyzer/requirements.md +183 -0
  23. package/.kiro/specs/cdk-cost-analyzer/tasks.md +357 -0
  24. package/.kiro/specs/github-actions-ci/design.md +281 -0
  25. package/.kiro/specs/github-actions-ci/requirements.md +86 -0
  26. package/.kiro/specs/github-actions-ci/tasks.md +115 -0
  27. package/.kiro/specs/nlb-calculator-test-coverage/design.md +190 -0
  28. package/.kiro/specs/nlb-calculator-test-coverage/requirements.md +84 -0
  29. package/.kiro/specs/nlb-calculator-test-coverage/tasks.md +150 -0
  30. package/.kiro/specs/production-readiness/design.md +1213 -0
  31. package/.kiro/specs/production-readiness/requirements.md +312 -0
  32. package/.kiro/specs/production-readiness/tasks.md +269 -0
  33. package/.kiro/specs/repository-cleanup/design.md +283 -0
  34. package/.kiro/specs/repository-cleanup/requirements.md +74 -0
  35. package/.kiro/specs/repository-cleanup/tasks.md +64 -0
  36. package/.kiro/steering/aws-cli-best-practices.md +41 -0
  37. package/.kiro/steering/cdk-best-practices.md +49 -0
  38. package/.kiro/steering/development-standards.md +54 -0
  39. package/.kiro/steering/docker-best-practices.md +34 -0
  40. package/.kiro/steering/documentation-style.md +151 -0
  41. package/.kiro/steering/git-best-practices.md +37 -0
  42. package/.kiro/steering/mcp-best-practices.md +95 -0
  43. package/.kiro/steering/python-best-practices.md +48 -0
  44. package/.kiro/steering/react-best-practices.md +44 -0
  45. package/.kiro/steering/security-best-practices.md +41 -0
  46. package/.kiro/steering/testing-best-practices.md +59 -0
  47. package/.kiro/steering/typescript-best-practices.md +40 -0
  48. package/CHANGELOG.md +49 -0
  49. package/CONTRIBUTING.md +258 -0
  50. package/LICENSE +19 -0
  51. package/README.md +480 -0
  52. package/SECURITY.md +117 -0
  53. package/dist/api/index.d.ts +11 -0
  54. package/dist/api/index.js +65 -0
  55. package/dist/api/types.d.ts +15 -0
  56. package/dist/api/types.js +3 -0
  57. package/dist/cli/index.d.ts +2 -0
  58. package/dist/cli/index.js +262 -0
  59. package/dist/config/ConfigManager.d.ts +40 -0
  60. package/dist/config/ConfigManager.js +238 -0
  61. package/dist/config/index.d.ts +2 -0
  62. package/dist/config/index.js +19 -0
  63. package/dist/config/types.d.ts +72 -0
  64. package/dist/config/types.js +15 -0
  65. package/dist/diff/DiffEngine.d.ts +7 -0
  66. package/dist/diff/DiffEngine.js +73 -0
  67. package/dist/diff/index.d.ts +2 -0
  68. package/dist/diff/index.js +21 -0
  69. package/dist/diff/types.d.ts +20 -0
  70. package/dist/diff/types.js +3 -0
  71. package/dist/integrations/GitLabIntegration.d.ts +7 -0
  72. package/dist/integrations/GitLabIntegration.js +45 -0
  73. package/dist/integrations/index.d.ts +2 -0
  74. package/dist/integrations/index.js +21 -0
  75. package/dist/integrations/types.d.ts +11 -0
  76. package/dist/integrations/types.js +13 -0
  77. package/dist/parser/TemplateParser.d.ts +8 -0
  78. package/dist/parser/TemplateParser.js +75 -0
  79. package/dist/parser/index.d.ts +2 -0
  80. package/dist/parser/index.js +22 -0
  81. package/dist/parser/types.d.ts +30 -0
  82. package/dist/parser/types.js +3 -0
  83. package/dist/pipeline/PipelineOrchestrator.d.ts +23 -0
  84. package/dist/pipeline/PipelineOrchestrator.js +191 -0
  85. package/dist/pipeline/index.d.ts +2 -0
  86. package/dist/pipeline/index.js +19 -0
  87. package/dist/pipeline/types.d.ts +41 -0
  88. package/dist/pipeline/types.js +13 -0
  89. package/dist/pricing/CacheManager.d.ts +75 -0
  90. package/dist/pricing/CacheManager.js +195 -0
  91. package/dist/pricing/PricingClient.d.ts +17 -0
  92. package/dist/pricing/PricingClient.js +122 -0
  93. package/dist/pricing/PricingService.d.ts +16 -0
  94. package/dist/pricing/PricingService.js +149 -0
  95. package/dist/pricing/calculators/ALBCalculator.d.ts +16 -0
  96. package/dist/pricing/calculators/ALBCalculator.js +163 -0
  97. package/dist/pricing/calculators/APIGatewayCalculator.d.ts +10 -0
  98. package/dist/pricing/calculators/APIGatewayCalculator.js +177 -0
  99. package/dist/pricing/calculators/CloudFrontCalculator.d.ts +59 -0
  100. package/dist/pricing/calculators/CloudFrontCalculator.js +151 -0
  101. package/dist/pricing/calculators/DynamoDBCalculator.d.ts +9 -0
  102. package/dist/pricing/calculators/DynamoDBCalculator.js +146 -0
  103. package/dist/pricing/calculators/EC2Calculator.d.ts +7 -0
  104. package/dist/pricing/calculators/EC2Calculator.js +80 -0
  105. package/dist/pricing/calculators/ECSCalculator.d.ts +9 -0
  106. package/dist/pricing/calculators/ECSCalculator.js +116 -0
  107. package/dist/pricing/calculators/ElastiCacheCalculator.d.ts +8 -0
  108. package/dist/pricing/calculators/ElastiCacheCalculator.js +106 -0
  109. package/dist/pricing/calculators/LambdaCalculator.d.ts +13 -0
  110. package/dist/pricing/calculators/LambdaCalculator.js +111 -0
  111. package/dist/pricing/calculators/NLBCalculator.d.ts +16 -0
  112. package/dist/pricing/calculators/NLBCalculator.js +138 -0
  113. package/dist/pricing/calculators/NatGatewayCalculator.d.ts +12 -0
  114. package/dist/pricing/calculators/NatGatewayCalculator.js +116 -0
  115. package/dist/pricing/calculators/RDSCalculator.d.ts +9 -0
  116. package/dist/pricing/calculators/RDSCalculator.js +103 -0
  117. package/dist/pricing/calculators/S3Calculator.d.ts +8 -0
  118. package/dist/pricing/calculators/S3Calculator.js +68 -0
  119. package/dist/pricing/calculators/VPCEndpointCalculator.d.ts +12 -0
  120. package/dist/pricing/calculators/VPCEndpointCalculator.js +129 -0
  121. package/dist/pricing/index.d.ts +10 -0
  122. package/dist/pricing/index.js +37 -0
  123. package/dist/pricing/types.d.ts +53 -0
  124. package/dist/pricing/types.js +22 -0
  125. package/dist/releasetag.txt +1 -0
  126. package/dist/reporter/Reporter.d.ts +18 -0
  127. package/dist/reporter/Reporter.js +412 -0
  128. package/dist/reporter/index.d.ts +2 -0
  129. package/dist/reporter/index.js +21 -0
  130. package/dist/reporter/types.d.ts +72 -0
  131. package/dist/reporter/types.js +3 -0
  132. package/dist/synthesis/SynthesisOrchestrator.d.ts +26 -0
  133. package/dist/synthesis/SynthesisOrchestrator.js +243 -0
  134. package/dist/synthesis/index.d.ts +2 -0
  135. package/dist/synthesis/index.js +19 -0
  136. package/dist/synthesis/types.d.ts +17 -0
  137. package/dist/synthesis/types.js +13 -0
  138. package/dist/threshold/ThresholdEnforcer.d.ts +29 -0
  139. package/dist/threshold/ThresholdEnforcer.js +143 -0
  140. package/dist/threshold/index.d.ts +2 -0
  141. package/dist/threshold/index.js +19 -0
  142. package/dist/threshold/types.d.ts +15 -0
  143. package/dist/threshold/types.js +17 -0
  144. package/docs/CALCULATORS.md +820 -0
  145. package/docs/CI_CD.md +608 -0
  146. package/docs/CONFIGURATION.md +407 -0
  147. package/docs/DEVELOPMENT.md +387 -0
  148. package/docs/RELEASE.md +223 -0
  149. package/docs/TROUBLESHOOTING.md +847 -0
  150. package/examples/.cdk-cost-analyzer.yml +85 -0
  151. package/examples/.gitlab-ci.yml +125 -0
  152. package/examples/api-usage.js +26 -0
  153. package/examples/complex/base.json +16 -0
  154. package/examples/complex/target.json +29 -0
  155. package/examples/monorepo/.gitlab-ci.yml +251 -0
  156. package/examples/monorepo/README.md +341 -0
  157. package/examples/monorepo/package.json +27 -0
  158. package/examples/monorepo/packages/backend-infra/.cdk-cost-analyzer.yml +34 -0
  159. package/examples/monorepo/packages/backend-infra/bin/app.ts +16 -0
  160. package/examples/monorepo/packages/backend-infra/cdk.json +7 -0
  161. package/examples/monorepo/packages/backend-infra/lib/backend-stack.ts +128 -0
  162. package/examples/monorepo/packages/backend-infra/package.json +30 -0
  163. package/examples/monorepo/packages/backend-infra/tsconfig.json +11 -0
  164. package/examples/monorepo/packages/data-infra/.cdk-cost-analyzer.yml +38 -0
  165. package/examples/monorepo/packages/data-infra/bin/app.ts +16 -0
  166. package/examples/monorepo/packages/data-infra/cdk.json +7 -0
  167. package/examples/monorepo/packages/data-infra/lib/data-stack.ts +121 -0
  168. package/examples/monorepo/packages/data-infra/package.json +30 -0
  169. package/examples/monorepo/packages/data-infra/tsconfig.json +11 -0
  170. package/examples/monorepo/packages/frontend-infra/.cdk-cost-analyzer.yml +31 -0
  171. package/examples/monorepo/packages/frontend-infra/bin/app.ts +16 -0
  172. package/examples/monorepo/packages/frontend-infra/cdk.json +7 -0
  173. package/examples/monorepo/packages/frontend-infra/lib/frontend-stack.ts +60 -0
  174. package/examples/monorepo/packages/frontend-infra/package.json +30 -0
  175. package/examples/monorepo/packages/frontend-infra/tsconfig.json +11 -0
  176. package/examples/monorepo/tsconfig.json +35 -0
  177. package/examples/multi-stack/.cdk-cost-analyzer.yml +72 -0
  178. package/examples/multi-stack/.gitlab-ci.yml +184 -0
  179. package/examples/multi-stack/README.md +279 -0
  180. package/examples/multi-stack/bin/app.ts +36 -0
  181. package/examples/multi-stack/cdk.json +72 -0
  182. package/examples/multi-stack/lib/compute-stack.ts +128 -0
  183. package/examples/multi-stack/lib/networking-stack.ts +69 -0
  184. package/examples/multi-stack/lib/storage-stack.ts +141 -0
  185. package/examples/multi-stack/package-lock.json +4437 -0
  186. package/examples/multi-stack/package.json +42 -0
  187. package/examples/multi-stack/tsconfig.json +34 -0
  188. package/examples/simple/base.json +8 -0
  189. package/examples/simple/target.json +14 -0
  190. package/examples/single-stack/.NVP +0 -0
  191. package/examples/single-stack/.cdk-cost-analyzer.yml +52 -0
  192. package/examples/single-stack/.gitlab-ci.yml +126 -0
  193. package/examples/single-stack/README.md +184 -0
  194. package/examples/single-stack/UeK +0 -0
  195. package/examples/single-stack/bin/app.ts +16 -0
  196. package/examples/single-stack/cdk.json +72 -0
  197. package/examples/single-stack/lib/infrastructure-stack.ts +119 -0
  198. package/examples/single-stack/package-lock.json +4443 -0
  199. package/examples/single-stack/package.json +38 -0
  200. package/examples/single-stack/tsconfig.json +34 -0
  201. package/package.json +139 -0
  202. package/test-cdk-project/README-COMPUTE.md +141 -0
  203. package/test-cdk-project/README.md +95 -0
  204. package/test-cdk-project/app-with-compute.js +102 -0
  205. package/test-cdk-project/app.js +81 -0
  206. package/test-cdk-project/cdk-compute.json +3 -0
  207. package/test-cdk-project/cdk.context.json +7 -0
  208. package/test-cdk-project/cdk.json +3 -0
  209. package/test-cdk-project/cdk.out/TestStack.assets.json +21 -0
  210. package/test-cdk-project/cdk.out/TestStack.template.json +115 -0
  211. package/test-cdk-project/cdk.out/cdk.out +1 -0
  212. package/test-cdk-project/cdk.out/manifest.json +503 -0
  213. package/test-cdk-project/cdk.out/tree.json +1 -0
  214. package/test-cdk-project/cdk.out.base/TestStack.assets.json +21 -0
  215. package/test-cdk-project/cdk.out.base/TestStack.template.json +115 -0
  216. package/test-cdk-project/cdk.out.base/cdk.out +1 -0
  217. package/test-cdk-project/cdk.out.base/manifest.json +503 -0
  218. package/test-cdk-project/cdk.out.base/tree.json +1 -0
  219. package/test-cdk-project/cdk.out.target/TestStack.assets.json +21 -0
  220. package/test-cdk-project/cdk.out.target/TestStack.template.json +183 -0
  221. package/test-cdk-project/cdk.out.target/cdk.out +1 -0
  222. package/test-cdk-project/cdk.out.target/manifest.json +521 -0
  223. package/test-cdk-project/cdk.out.target/tree.json +1 -0
  224. package/test-cdk-project/package-lock.json +422 -0
  225. package/test-cdk-project/package.json +17 -0
  226. package/tools/workflows/README.md +102 -0
  227. package/tools/workflows/validate-workflows.js +109 -0
  228. package/tools/workflows/workflow-utils.ts +181 -0
@@ -0,0 +1,72 @@
1
+ export interface CostAnalyzerConfig {
2
+ thresholds?: ThresholdConfig;
3
+ usageAssumptions?: UsageAssumptionsConfig;
4
+ synthesis?: SynthesisConfig;
5
+ exclusions?: ExclusionsConfig;
6
+ cache?: CacheConfig;
7
+ }
8
+ export interface ThresholdConfig {
9
+ default?: ThresholdLevels;
10
+ environments?: Record<string, ThresholdLevels>;
11
+ }
12
+ export interface ThresholdLevels {
13
+ warning?: number;
14
+ error?: number;
15
+ }
16
+ export interface UsageAssumptionsConfig {
17
+ s3?: {
18
+ storageGB?: number;
19
+ getRequests?: number;
20
+ putRequests?: number;
21
+ };
22
+ lambda?: {
23
+ invocationsPerMonth?: number;
24
+ averageDurationMs?: number;
25
+ };
26
+ natGateway?: {
27
+ dataProcessedGB?: number;
28
+ };
29
+ alb?: {
30
+ newConnectionsPerSecond?: number;
31
+ activeConnectionsPerMinute?: number;
32
+ processedBytesGB?: number;
33
+ };
34
+ nlb?: {
35
+ newConnectionsPerSecond?: number;
36
+ activeConnectionsPerMinute?: number;
37
+ processedBytesGB?: number;
38
+ };
39
+ cloudfront?: {
40
+ dataTransferGB?: number;
41
+ requests?: number;
42
+ };
43
+ apiGateway?: {
44
+ requestsPerMonth?: number;
45
+ };
46
+ vpcEndpoint?: {
47
+ dataProcessedGB?: number;
48
+ };
49
+ }
50
+ export interface SynthesisConfig {
51
+ appPath?: string;
52
+ outputPath?: string;
53
+ customCommand?: string;
54
+ context?: Record<string, string>;
55
+ }
56
+ export interface ExclusionsConfig {
57
+ resourceTypes?: string[];
58
+ }
59
+ export interface CacheConfig {
60
+ enabled?: boolean;
61
+ durationHours?: number;
62
+ }
63
+ export interface ValidationResult {
64
+ valid: boolean;
65
+ errors: string[];
66
+ warnings: string[];
67
+ }
68
+ export declare class ConfigurationError extends Error {
69
+ configPath: string;
70
+ validationErrors: string[];
71
+ constructor(message: string, configPath: string, validationErrors: string[]);
72
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigurationError = void 0;
4
+ class ConfigurationError extends Error {
5
+ configPath;
6
+ validationErrors;
7
+ constructor(message, configPath, validationErrors) {
8
+ super(message);
9
+ this.configPath = configPath;
10
+ this.validationErrors = validationErrors;
11
+ this.name = 'ConfigurationError';
12
+ }
13
+ }
14
+ exports.ConfigurationError = ConfigurationError;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJFQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICBuYXRHYXRld2F5Pzoge1xuICAgIGRhdGFQcm9jZXNzZWRHQj86IG51bWJlcjtcbiAgfTtcbiAgYWxiPzoge1xuICAgIG5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kPzogbnVtYmVyO1xuICAgIGFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlPzogbnVtYmVyO1xuICAgIHByb2Nlc3NlZEJ5dGVzR0I/OiBudW1iZXI7XG4gIH07XG4gIG5sYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBjbG91ZGZyb250Pzoge1xuICAgIGRhdGFUcmFuc2ZlckdCPzogbnVtYmVyO1xuICAgIHJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICBhcGlHYXRld2F5Pzoge1xuICAgIHJlcXVlc3RzUGVyTW9udGg/OiBudW1iZXI7XG4gIH07XG4gIHZwY0VuZHBvaW50Pzoge1xuICAgIGRhdGFQcm9jZXNzZWRHQj86IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW50aGVzaXNDb25maWcge1xuICBhcHBQYXRoPzogc3RyaW5nO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICBjdXN0b21Db21tYW5kPzogc3RyaW5nO1xuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGNsdXNpb25zQ29uZmlnIHtcbiAgcmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGR1cmF0aW9uSG91cnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBlcnJvcnM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgY29uZmlnUGF0aDogc3RyaW5nLFxuICAgIHB1YmxpYyB2YWxpZGF0aW9uRXJyb3JzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ3VyYXRpb25FcnJvcic7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { DiffEngine as IDiffEngine, ResourceDiff } from './types';
2
+ import { CloudFormationTemplate } from '../parser/types';
3
+ export declare class DiffEngine implements IDiffEngine {
4
+ diff(base: CloudFormationTemplate, target: CloudFormationTemplate): ResourceDiff;
5
+ private arePropertiesEqual;
6
+ private sortObject;
7
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DiffEngine = void 0;
4
+ class DiffEngine {
5
+ diff(base, target) {
6
+ const baseResources = base.Resources || {};
7
+ const targetResources = target.Resources || {};
8
+ const baseIds = new Set(Object.keys(baseResources));
9
+ const targetIds = new Set(Object.keys(targetResources));
10
+ const added = [];
11
+ const removed = [];
12
+ const modified = [];
13
+ for (const logicalId of targetIds) {
14
+ if (!baseIds.has(logicalId)) {
15
+ const resource = targetResources[logicalId];
16
+ added.push({
17
+ logicalId,
18
+ type: resource.Type,
19
+ properties: resource.Properties || {},
20
+ });
21
+ }
22
+ }
23
+ for (const logicalId of baseIds) {
24
+ if (!targetIds.has(logicalId)) {
25
+ const resource = baseResources[logicalId];
26
+ removed.push({
27
+ logicalId,
28
+ type: resource.Type,
29
+ properties: resource.Properties || {},
30
+ });
31
+ }
32
+ }
33
+ for (const logicalId of baseIds) {
34
+ if (targetIds.has(logicalId)) {
35
+ const baseResource = baseResources[logicalId];
36
+ const targetResource = targetResources[logicalId];
37
+ if (!this.arePropertiesEqual(baseResource.Properties, targetResource.Properties)) {
38
+ modified.push({
39
+ logicalId,
40
+ type: targetResource.Type,
41
+ oldProperties: baseResource.Properties || {},
42
+ newProperties: targetResource.Properties || {},
43
+ });
44
+ }
45
+ }
46
+ }
47
+ return { added, removed, modified };
48
+ }
49
+ arePropertiesEqual(props1, props2) {
50
+ const p1 = props1 || {};
51
+ const p2 = props2 || {};
52
+ return JSON.stringify(this.sortObject(p1)) === JSON.stringify(this.sortObject(p2));
53
+ }
54
+ sortObject(obj) {
55
+ if (obj === null || obj === undefined) {
56
+ return obj;
57
+ }
58
+ if (Array.isArray(obj)) {
59
+ return obj.map(item => this.sortObject(item));
60
+ }
61
+ if (typeof obj === 'object') {
62
+ const sorted = {};
63
+ const keys = Object.keys(obj).sort();
64
+ for (const key of keys) {
65
+ sorted[key] = this.sortObject(obj[key]);
66
+ }
67
+ return sorted;
68
+ }
69
+ return obj;
70
+ }
71
+ }
72
+ exports.DiffEngine = DiffEngine;
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlmZkVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL0RpZmZFbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBYSxVQUFVO0lBQ3JCLElBQUksQ0FBQyxJQUE0QixFQUFFLE1BQThCO1FBQy9ELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQzNDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBRS9DLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFeEQsTUFBTSxLQUFLLEdBQXFCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBcUIsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUF1QixFQUFFLENBQUM7UUFFeEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ1QsU0FBUztvQkFDVCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7b0JBQ25CLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7aUJBQ3RDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsU0FBUztvQkFDVCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7b0JBQ25CLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7aUJBQ3RDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRWxELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDakYsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDWixTQUFTO3dCQUNULElBQUksRUFBRSxjQUFjLENBQUMsSUFBSTt3QkFDekIsYUFBYSxFQUFFLFlBQVksQ0FBQyxVQUFVLElBQUksRUFBRTt3QkFDNUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxVQUFVLElBQUksRUFBRTtxQkFDL0MsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsTUFBMkMsRUFDM0MsTUFBMkM7UUFFM0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRXhCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVPLFVBQVUsQ0FBQyxHQUFZO1FBQzdCLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUE4QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUUsR0FBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFuRkQsZ0NBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlmZkVuZ2luZSBhcyBJRGlmZkVuZ2luZSwgUmVzb3VyY2VEaWZmLCBSZXNvdXJjZVdpdGhJZCwgTW9kaWZpZWRSZXNvdXJjZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3BhcnNlci90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBEaWZmRW5naW5lIGltcGxlbWVudHMgSURpZmZFbmdpbmUge1xuICBkaWZmKGJhc2U6IENsb3VkRm9ybWF0aW9uVGVtcGxhdGUsIHRhcmdldDogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSk6IFJlc291cmNlRGlmZiB7XG4gICAgY29uc3QgYmFzZVJlc291cmNlcyA9IGJhc2UuUmVzb3VyY2VzIHx8IHt9O1xuICAgIGNvbnN0IHRhcmdldFJlc291cmNlcyA9IHRhcmdldC5SZXNvdXJjZXMgfHwge307XG5cbiAgICBjb25zdCBiYXNlSWRzID0gbmV3IFNldChPYmplY3Qua2V5cyhiYXNlUmVzb3VyY2VzKSk7XG4gICAgY29uc3QgdGFyZ2V0SWRzID0gbmV3IFNldChPYmplY3Qua2V5cyh0YXJnZXRSZXNvdXJjZXMpKTtcblxuICAgIGNvbnN0IGFkZGVkOiBSZXNvdXJjZVdpdGhJZFtdID0gW107XG4gICAgY29uc3QgcmVtb3ZlZDogUmVzb3VyY2VXaXRoSWRbXSA9IFtdO1xuICAgIGNvbnN0IG1vZGlmaWVkOiBNb2RpZmllZFJlc291cmNlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHRhcmdldElkcykge1xuICAgICAgaWYgKCFiYXNlSWRzLmhhcyhsb2dpY2FsSWQpKSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGFyZ2V0UmVzb3VyY2VzW2xvZ2ljYWxJZF07XG4gICAgICAgIGFkZGVkLnB1c2goe1xuICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS5UeXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLlByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIGJhc2VJZHMpIHtcbiAgICAgIGlmICghdGFyZ2V0SWRzLmhhcyhsb2dpY2FsSWQpKSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gYmFzZVJlc291cmNlc1tsb2dpY2FsSWRdO1xuICAgICAgICByZW1vdmVkLnB1c2goe1xuICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS5UeXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLlByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIGJhc2VJZHMpIHtcbiAgICAgIGlmICh0YXJnZXRJZHMuaGFzKGxvZ2ljYWxJZCkpIHtcbiAgICAgICAgY29uc3QgYmFzZVJlc291cmNlID0gYmFzZVJlc291cmNlc1tsb2dpY2FsSWRdO1xuICAgICAgICBjb25zdCB0YXJnZXRSZXNvdXJjZSA9IHRhcmdldFJlc291cmNlc1tsb2dpY2FsSWRdO1xuXG4gICAgICAgIGlmICghdGhpcy5hcmVQcm9wZXJ0aWVzRXF1YWwoYmFzZVJlc291cmNlLlByb3BlcnRpZXMsIHRhcmdldFJlc291cmNlLlByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgbW9kaWZpZWQucHVzaCh7XG4gICAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgICB0eXBlOiB0YXJnZXRSZXNvdXJjZS5UeXBlLFxuICAgICAgICAgICAgb2xkUHJvcGVydGllczogYmFzZVJlc291cmNlLlByb3BlcnRpZXMgfHwge30sXG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzOiB0YXJnZXRSZXNvdXJjZS5Qcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWRkZWQsIHJlbW92ZWQsIG1vZGlmaWVkIH07XG4gIH1cblxuICBwcml2YXRlIGFyZVByb3BlcnRpZXNFcXVhbChcbiAgICBwcm9wczE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgIHByb3BzMjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHAxID0gcHJvcHMxIHx8IHt9O1xuICAgIGNvbnN0IHAyID0gcHJvcHMyIHx8IHt9O1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc29ydE9iamVjdChwMSkpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLnNvcnRPYmplY3QocDIpKTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydE9iamVjdChvYmo6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoubWFwKGl0ZW0gPT4gdGhpcy5zb3J0T2JqZWN0KGl0ZW0pKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnNvcnQoKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgc29ydGVkW2tleV0gPSB0aGlzLnNvcnRPYmplY3QoKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc29ydGVkO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { DiffEngine } from './DiffEngine';
2
+ export * from './types';
@@ -0,0 +1,21 @@
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.DiffEngine = void 0;
18
+ var DiffEngine_1 = require("./DiffEngine");
19
+ Object.defineProperty(exports, "DiffEngine", { enumerable: true, get: function () { return DiffEngine_1.DiffEngine; } });
20
+ __exportStar(require("./types"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlmZi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUEwQztBQUFqQyx3R0FBQSxVQUFVLE9BQUE7QUFDbkIsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRGlmZkVuZ2luZSB9IGZyb20gJy4vRGlmZkVuZ2luZSc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { CloudFormationTemplate } from '../parser/types';
2
+ export interface DiffEngine {
3
+ diff(base: CloudFormationTemplate, target: CloudFormationTemplate): ResourceDiff;
4
+ }
5
+ export interface ResourceDiff {
6
+ added: ResourceWithId[];
7
+ removed: ResourceWithId[];
8
+ modified: ModifiedResource[];
9
+ }
10
+ export interface ResourceWithId {
11
+ logicalId: string;
12
+ type: string;
13
+ properties: Record<string, unknown>;
14
+ }
15
+ export interface ModifiedResource {
16
+ logicalId: string;
17
+ type: string;
18
+ oldProperties: Record<string, unknown>;
19
+ newProperties: Record<string, unknown>;
20
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlmZi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3BhcnNlci90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlmZkVuZ2luZSB7XG4gIGRpZmYoYmFzZTogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSwgdGFyZ2V0OiBDbG91ZEZvcm1hdGlvblRlbXBsYXRlKTogUmVzb3VyY2VEaWZmO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlRGlmZiB7XG4gIGFkZGVkOiBSZXNvdXJjZVdpdGhJZFtdO1xuICByZW1vdmVkOiBSZXNvdXJjZVdpdGhJZFtdO1xuICBtb2RpZmllZDogTW9kaWZpZWRSZXNvdXJjZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlV2l0aElkIHtcbiAgbG9naWNhbElkOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kaWZpZWRSZXNvdXJjZSB7XG4gIGxvZ2ljYWxJZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIG9sZFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBuZXdQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { GitLabIntegration as IGitLabIntegration, GitLabConfig } from './types';
2
+ export declare class GitLabIntegration implements IGitLabIntegration {
3
+ static fromEnvironment(): GitLabIntegration;
4
+ private config;
5
+ constructor(config: GitLabConfig);
6
+ postMergeRequestComment(projectId: string, mergeRequestIid: string, comment: string): Promise<void>;
7
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLabIntegration = void 0;
4
+ const types_1 = require("./types");
5
+ class GitLabIntegration {
6
+ static fromEnvironment() {
7
+ const token = process.env.CI_JOB_TOKEN || process.env.GITLAB_TOKEN;
8
+ const apiUrl = process.env.CI_API_V4_URL || 'https://gitlab.com/api/v4';
9
+ if (!token) {
10
+ throw new Error('GitLab token not found. Set CI_JOB_TOKEN or GITLAB_TOKEN environment variable.');
11
+ }
12
+ return new GitLabIntegration({ token, apiUrl });
13
+ }
14
+ config;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ async postMergeRequestComment(projectId, mergeRequestIid, comment) {
19
+ const url = `${this.config.apiUrl}/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/notes`;
20
+ try {
21
+ const response = await fetch(url, {
22
+ method: 'POST',
23
+ headers: {
24
+ 'PRIVATE-TOKEN': this.config.token,
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ body: JSON.stringify({
28
+ body: comment,
29
+ }),
30
+ });
31
+ if (!response.ok) {
32
+ const errorText = await response.text();
33
+ throw new types_1.GitLabAPIError(`Failed to post comment: ${response.statusText} - ${errorText}`, response.status);
34
+ }
35
+ }
36
+ catch (error) {
37
+ if (error instanceof types_1.GitLabAPIError) {
38
+ throw error;
39
+ }
40
+ throw new types_1.GitLabAPIError(`Failed to connect to GitLab API: ${error instanceof Error ? error.message : String(error)}`);
41
+ }
42
+ }
43
+ }
44
+ exports.GitLabIntegration = GitLabIntegration;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0TGFiSW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFnRztBQUVoRyxNQUFhLGlCQUFpQjtJQUM1QixNQUFNLENBQUMsZUFBZTtRQUNwQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSwyQkFBMkIsQ0FBQztRQUV4RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUNiLGdGQUFnRixDQUNqRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxNQUFNLENBQWU7SUFFN0IsWUFBWSxNQUFvQjtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixTQUFpQixFQUNqQixlQUF1QixFQUN2QixPQUFlO1FBRWYsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sYUFBYSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLGVBQWUsUUFBUSxDQUFDO1FBRXRILElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDaEMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFO29CQUNQLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7b0JBQ2xDLGNBQWMsRUFBRSxrQkFBa0I7aUJBQ25DO2dCQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixJQUFJLEVBQUUsT0FBTztpQkFDZCxDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sSUFBSSxzQkFBYyxDQUN0QiwyQkFBMkIsUUFBUSxDQUFDLFVBQVUsTUFBTSxTQUFTLEVBQUUsRUFDL0QsUUFBUSxDQUFDLE1BQU0sQ0FDaEIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLHNCQUFjLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxJQUFJLHNCQUFjLENBQ3RCLG9DQUFvQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDN0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF2REQsOENBdURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2l0TGFiSW50ZWdyYXRpb24gYXMgSUdpdExhYkludGVncmF0aW9uLCBHaXRMYWJDb25maWcsIEdpdExhYkFQSUVycm9yIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBHaXRMYWJJbnRlZ3JhdGlvbiBpbXBsZW1lbnRzIElHaXRMYWJJbnRlZ3JhdGlvbiB7XG4gIHN0YXRpYyBmcm9tRW52aXJvbm1lbnQoKTogR2l0TGFiSW50ZWdyYXRpb24ge1xuICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnYuQ0lfSk9CX1RPS0VOIHx8IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTjtcbiAgICBjb25zdCBhcGlVcmwgPSBwcm9jZXNzLmVudi5DSV9BUElfVjRfVVJMIHx8ICdodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0JztcblxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dpdExhYiB0b2tlbiBub3QgZm91bmQuIFNldCBDSV9KT0JfVE9LRU4gb3IgR0lUTEFCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgR2l0TGFiSW50ZWdyYXRpb24oeyB0b2tlbiwgYXBpVXJsIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWc6IEdpdExhYkNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdpdExhYkNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgYXN5bmMgcG9zdE1lcmdlUmVxdWVzdENvbW1lbnQoXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgbWVyZ2VSZXF1ZXN0SWlkOiBzdHJpbmcsXG4gICAgY29tbWVudDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5hcGlVcmx9L3Byb2plY3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RJZCl9L21lcmdlX3JlcXVlc3RzLyR7bWVyZ2VSZXF1ZXN0SWlkfS9ub3Rlc2A7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnUFJJVkFURS1UT0tFTic6IHRoaXMuY29uZmlnLnRva2VuLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBib2R5OiBjb21tZW50LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgdGhyb3cgbmV3IEdpdExhYkFQSUVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcG9zdCBjb21tZW50OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9IC0gJHtlcnJvclRleHR9YCxcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEdpdExhYkFQSUVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEdpdExhYkFQSUVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGNvbm5lY3QgdG8gR2l0TGFiIEFQSTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ export { GitLabIntegration } from './GitLabIntegration';
@@ -0,0 +1,21 @@
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.GitLabIntegration = void 0;
18
+ __exportStar(require("./types"), exports);
19
+ var GitLabIntegration_1 = require("./GitLabIntegration");
20
+ Object.defineProperty(exports, "GitLabIntegration", { enumerable: true, get: function () { return GitLabIntegration_1.GitLabIntegration; } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQXdCO0FBQ3hCLHlEQUF3RDtBQUEvQyxzSEFBQSxpQkFBaUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgR2l0TGFiSW50ZWdyYXRpb24gfSBmcm9tICcuL0dpdExhYkludGVncmF0aW9uJztcbiJdfQ==
@@ -0,0 +1,11 @@
1
+ export interface GitLabIntegration {
2
+ postMergeRequestComment(projectId: string, mergeRequestIid: string, comment: string): Promise<void>;
3
+ }
4
+ export interface GitLabConfig {
5
+ token: string;
6
+ apiUrl: string;
7
+ }
8
+ export declare class GitLabAPIError extends Error {
9
+ statusCode?: number | undefined;
10
+ constructor(message: string, statusCode?: number | undefined);
11
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLabAPIError = void 0;
4
+ class GitLabAPIError extends Error {
5
+ statusCode;
6
+ constructor(message, statusCode) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.name = 'GitLabAPIError';
10
+ }
11
+ }
12
+ exports.GitLabAPIError = GitLabAPIError;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZWdyYXRpb25zL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWFBLE1BQWEsY0FBZSxTQUFRLEtBQUs7SUFDSDtJQUFwQyxZQUFZLE9BQWUsRUFBUyxVQUFtQjtRQUNyRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEbUIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQUVyRCxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUxELHdDQUtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBHaXRMYWJJbnRlZ3JhdGlvbiB7XG4gIHBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgIHByb2plY3RJZDogc3RyaW5nLFxuICAgIG1lcmdlUmVxdWVzdElpZDogc3RyaW5nLFxuICAgIGNvbW1lbnQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdExhYkNvbmZpZyB7XG4gIHRva2VuOiBzdHJpbmc7XG4gIGFwaVVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0TGFiQVBJRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHN0YXR1c0NvZGU/OiBudW1iZXIpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnR2l0TGFiQVBJRXJyb3InO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ import { CloudFormationTemplate, TemplateParser as ITemplateParser } from './types';
2
+ export declare class TemplateParseError extends Error {
3
+ templatePath?: string | undefined;
4
+ constructor(message: string, templatePath?: string | undefined);
5
+ }
6
+ export declare class TemplateParser implements ITemplateParser {
7
+ parse(content: string): CloudFormationTemplate;
8
+ }
@@ -0,0 +1,75 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TemplateParser = exports.TemplateParseError = void 0;
37
+ const yaml = __importStar(require("js-yaml"));
38
+ class TemplateParseError extends Error {
39
+ templatePath;
40
+ constructor(message, templatePath) {
41
+ super(message);
42
+ this.templatePath = templatePath;
43
+ this.name = 'TemplateParseError';
44
+ }
45
+ }
46
+ exports.TemplateParseError = TemplateParseError;
47
+ class TemplateParser {
48
+ parse(content) {
49
+ if (!content || content.trim() === '') {
50
+ throw new TemplateParseError('Template content is empty');
51
+ }
52
+ let template;
53
+ try {
54
+ template = JSON.parse(content);
55
+ }
56
+ catch (jsonError) {
57
+ try {
58
+ template = yaml.load(content);
59
+ }
60
+ catch (yamlError) {
61
+ throw new TemplateParseError(`Failed to parse template as JSON or YAML: ${yamlError instanceof Error ? yamlError.message : String(yamlError)}`);
62
+ }
63
+ }
64
+ if (!template || typeof template !== 'object') {
65
+ throw new TemplateParseError('Parsed template is not an object');
66
+ }
67
+ const parsedTemplate = template;
68
+ if (!parsedTemplate.Resources || typeof parsedTemplate.Resources !== 'object') {
69
+ throw new TemplateParseError('Template must contain a Resources section');
70
+ }
71
+ return parsedTemplate;
72
+ }
73
+ }
74
+ exports.TemplateParser = TemplateParser;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2VyL1RlbXBsYXRlUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFnQztBQUdoQyxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFDUDtJQUFwQyxZQUFZLE9BQWUsRUFBUyxZQUFxQjtRQUN2RCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEbUIsaUJBQVksR0FBWixZQUFZLENBQVM7UUFFdkQsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFMRCxnREFLQztBQUVELE1BQWEsY0FBYztJQUN6QixLQUFLLENBQUMsT0FBZTtRQUNuQixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksa0JBQWtCLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQsSUFBSSxRQUFpQixDQUFDO1FBRXRCLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFBQyxPQUFPLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQUMsT0FBTyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLGtCQUFrQixDQUMxQiw2Q0FBNkMsU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQ2xILENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLFFBQTJDLENBQUM7UUFFbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksT0FBTyxjQUFjLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlFLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCxPQUFPLGNBQXdDLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBaENELHdDQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvblRlbXBsYXRlLCBUZW1wbGF0ZVBhcnNlciBhcyBJVGVtcGxhdGVQYXJzZXIgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUGFyc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBwdWJsaWMgdGVtcGxhdGVQYXRoPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1RlbXBsYXRlUGFyc2VFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUGFyc2VyIGltcGxlbWVudHMgSVRlbXBsYXRlUGFyc2VyIHtcbiAgcGFyc2UoY29udGVudDogc3RyaW5nKTogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB7XG4gICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlUGFyc2VFcnJvcignVGVtcGxhdGUgY29udGVudCBpcyBlbXB0eScpO1xuICAgIH1cblxuICAgIGxldCB0ZW1wbGF0ZTogdW5rbm93bjtcblxuICAgIHRyeSB7XG4gICAgICB0ZW1wbGF0ZSA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgfSBjYXRjaCAoanNvbkVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0ZW1wbGF0ZSA9IHlhbWwubG9hZChjb250ZW50KTtcbiAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgVGVtcGxhdGVQYXJzZUVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgdGVtcGxhdGUgYXMgSlNPTiBvciBZQU1MOiAke3lhbWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8geWFtbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoeWFtbEVycm9yKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGVtcGxhdGUgfHwgdHlwZW9mIHRlbXBsYXRlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlUGFyc2VFcnJvcignUGFyc2VkIHRlbXBsYXRlIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRUZW1wbGF0ZSA9IHRlbXBsYXRlIGFzIFBhcnRpYWw8Q2xvdWRGb3JtYXRpb25UZW1wbGF0ZT47XG5cbiAgICBpZiAoIXBhcnNlZFRlbXBsYXRlLlJlc291cmNlcyB8fCB0eXBlb2YgcGFyc2VkVGVtcGxhdGUuUmVzb3VyY2VzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFRlbXBsYXRlUGFyc2VFcnJvcignVGVtcGxhdGUgbXVzdCBjb250YWluIGEgUmVzb3VyY2VzIHNlY3Rpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkVGVtcGxhdGUgYXMgQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export { TemplateParser, TemplateParseError } from './TemplateParser';
2
+ export * from './types';
@@ -0,0 +1,22 @@
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.TemplateParseError = exports.TemplateParser = void 0;
18
+ var TemplateParser_1 = require("./TemplateParser");
19
+ Object.defineProperty(exports, "TemplateParser", { enumerable: true, get: function () { return TemplateParser_1.TemplateParser; } });
20
+ Object.defineProperty(exports, "TemplateParseError", { enumerable: true, get: function () { return TemplateParser_1.TemplateParseError; } });
21
+ __exportStar(require("./types"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQXNFO0FBQTdELGdIQUFBLGNBQWMsT0FBQTtBQUFFLG9IQUFBLGtCQUFrQixPQUFBO0FBQzNDLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFRlbXBsYXRlUGFyc2VyLCBUZW1wbGF0ZVBhcnNlRXJyb3IgfSBmcm9tICcuL1RlbXBsYXRlUGFyc2VyJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
@@ -0,0 +1,30 @@
1
+ export interface CloudFormationTemplate {
2
+ AWSTemplateFormatVersion?: string;
3
+ Description?: string;
4
+ Metadata?: Record<string, unknown>;
5
+ Parameters?: Record<string, Parameter>;
6
+ Resources: Record<string, Resource>;
7
+ Outputs?: Record<string, Output>;
8
+ }
9
+ export interface Resource {
10
+ Type: string;
11
+ Properties: Record<string, unknown>;
12
+ DependsOn?: string | string[];
13
+ Metadata?: Record<string, unknown>;
14
+ }
15
+ export interface Parameter {
16
+ Type: string;
17
+ Default?: unknown;
18
+ Description?: string;
19
+ AllowedValues?: unknown[];
20
+ }
21
+ export interface Output {
22
+ Value: unknown;
23
+ Description?: string;
24
+ Export?: {
25
+ Name: string;
26
+ };
27
+ }
28
+ export interface TemplateParser {
29
+ parse(content: string): CloudFormationTemplate;
30
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2VyL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb24/OiBzdHJpbmc7XG4gIERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBQYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgUGFyYW1ldGVyPjtcbiAgUmVzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZT47XG4gIE91dHB1dHM/OiBSZWNvcmQ8c3RyaW5nLCBPdXRwdXQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlIHtcbiAgVHlwZTogc3RyaW5nO1xuICBQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgRGVwZW5kc09uPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyIHtcbiAgVHlwZTogc3RyaW5nO1xuICBEZWZhdWx0PzogdW5rbm93bjtcbiAgRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEFsbG93ZWRWYWx1ZXM/OiB1bmtub3duW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0IHtcbiAgVmFsdWU6IHVua25vd247XG4gIERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBFeHBvcnQ/OiB7XG4gICAgTmFtZTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlUGFyc2VyIHtcbiAgcGFyc2UoY29udGVudDogc3RyaW5nKTogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { PipelineOptions, PipelineResult } from './types';
2
+ export declare class PipelineOrchestrator {
3
+ private configManager;
4
+ private synthesisOrchestrator;
5
+ private thresholdEnforcer;
6
+ constructor();
7
+ /**
8
+ * Run complete pipeline analysis
9
+ */
10
+ runPipelineAnalysis(options: PipelineOptions): Promise<PipelineResult>;
11
+ /**
12
+ * Synthesize both base and target branches
13
+ */
14
+ private synthesizeBothBranches;
15
+ /**
16
+ * Analyze costs between two templates
17
+ */
18
+ private analyzeCosts;
19
+ /**
20
+ * Build configuration summary
21
+ */
22
+ private buildConfigSummary;
23
+ }