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,243 @@
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.SynthesisOrchestrator = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ const types_1 = require("./types");
41
+ class SynthesisOrchestrator {
42
+ DEFAULT_OUTPUT_PATH = 'cdk.out';
43
+ /**
44
+ * Execute CDK synthesis
45
+ */
46
+ async synthesize(options) {
47
+ const startTime = Date.now();
48
+ try {
49
+ const outputPath = options.outputPath || this.DEFAULT_OUTPUT_PATH;
50
+ const command = options.customCommand || 'npx cdk synth';
51
+ await this.executeSynthesis(command, options.cdkAppPath, options.context, outputPath);
52
+ const fullOutputPath = path.join(options.cdkAppPath, outputPath);
53
+ const { templatePaths, stackNames } = await this.findTemplates(fullOutputPath);
54
+ const duration = Date.now() - startTime;
55
+ return {
56
+ success: true,
57
+ templatePaths,
58
+ stackNames,
59
+ duration,
60
+ };
61
+ }
62
+ catch (error) {
63
+ const duration = Date.now() - startTime;
64
+ const errorMessage = error instanceof Error ? error.message : String(error);
65
+ if (error instanceof types_1.SynthesisError) {
66
+ return {
67
+ success: false,
68
+ templatePaths: [],
69
+ stackNames: [],
70
+ error: errorMessage,
71
+ duration,
72
+ };
73
+ }
74
+ return {
75
+ success: false,
76
+ templatePaths: [],
77
+ stackNames: [],
78
+ error: `Synthesis failed: ${errorMessage}`,
79
+ duration,
80
+ };
81
+ }
82
+ }
83
+ /**
84
+ * Execute synthesis command
85
+ *
86
+ * Uses shell: false for security to prevent command injection attacks.
87
+ * Arguments are passed as an array to avoid shell interpretation.
88
+ *
89
+ * Implements a 15-second timeout to prevent hanging processes in CI:
90
+ * - Sends SIGTERM for graceful termination
91
+ * - Follows up with SIGKILL after 1 second if process doesn't exit
92
+ * - Prevents duplicate resolution using isResolved flag
93
+ * - Ensures all event listeners are cleaned up
94
+ * - Uses process.kill as fallback for stubborn processes
95
+ */
96
+ async executeSynthesis(command, cdkAppPath, context, outputPath) {
97
+ return new Promise((resolve, reject) => {
98
+ const [cmd, ...args] = command.split(' ');
99
+ // Add context arguments
100
+ const allArgs = [...args];
101
+ if (context) {
102
+ for (const [key, value] of Object.entries(context)) {
103
+ allArgs.push('-c', `${key}=${value}`);
104
+ }
105
+ }
106
+ // Add output path if specified
107
+ if (outputPath) {
108
+ allArgs.push('--output', outputPath);
109
+ }
110
+ // Use shell: false for security and pass arguments properly
111
+ const proc = (0, child_process_1.spawn)(cmd, allArgs, {
112
+ cwd: cdkAppPath,
113
+ shell: false,
114
+ stdio: ['ignore', 'pipe', 'pipe'],
115
+ detached: false, // Ensure process is part of the same process group
116
+ });
117
+ let stdout = '';
118
+ let stderr = '';
119
+ let isResolved = false;
120
+ let killTimeout = null;
121
+ const cleanup = () => {
122
+ if (killTimeout) {
123
+ clearTimeout(killTimeout);
124
+ killTimeout = null;
125
+ }
126
+ // Remove all listeners to prevent memory leaks
127
+ proc.removeAllListeners();
128
+ proc.stdout?.removeAllListeners();
129
+ proc.stderr?.removeAllListeners();
130
+ };
131
+ const forceKill = () => {
132
+ try {
133
+ // Try multiple kill methods for stubborn processes
134
+ if (proc.pid && !proc.killed) {
135
+ proc.kill('SIGKILL');
136
+ // Also try process.kill as fallback
137
+ try {
138
+ process.kill(proc.pid, 'SIGKILL');
139
+ }
140
+ catch (killError) {
141
+ // Ignore kill errors - process might already be dead
142
+ }
143
+ }
144
+ }
145
+ catch (error) {
146
+ // Ignore errors during force kill
147
+ }
148
+ };
149
+ // Set up timeout to prevent hanging processes
150
+ const timeout = setTimeout(() => {
151
+ if (!isResolved) {
152
+ isResolved = true;
153
+ // First try graceful termination
154
+ proc.kill('SIGTERM');
155
+ // Force kill after 1 second if still running
156
+ killTimeout = setTimeout(() => {
157
+ forceKill();
158
+ }, 1000);
159
+ cleanup();
160
+ reject(new types_1.SynthesisError('CDK synthesis timed out after 15 seconds', stderr || stdout || 'No output captured'));
161
+ }
162
+ }, 15000); // Reduced to 15 second timeout
163
+ proc.stdout?.on('data', (data) => {
164
+ stdout += data.toString();
165
+ });
166
+ proc.stderr?.on('data', (data) => {
167
+ stderr += data.toString();
168
+ });
169
+ proc.on('error', (error) => {
170
+ if (!isResolved) {
171
+ isResolved = true;
172
+ clearTimeout(timeout);
173
+ cleanup();
174
+ reject(new types_1.SynthesisError(`Failed to execute synthesis command: ${error.message}`, stderr || 'No error output captured'));
175
+ }
176
+ });
177
+ proc.on('close', (code) => {
178
+ if (!isResolved) {
179
+ isResolved = true;
180
+ clearTimeout(timeout);
181
+ cleanup();
182
+ if (code !== 0) {
183
+ reject(new types_1.SynthesisError(`CDK synthesis failed with exit code ${code}`, stderr || stdout || 'No output captured'));
184
+ }
185
+ else {
186
+ resolve();
187
+ }
188
+ }
189
+ });
190
+ // Additional safety: handle process exit
191
+ proc.on('exit', (code, signal) => {
192
+ if (!isResolved) {
193
+ isResolved = true;
194
+ clearTimeout(timeout);
195
+ cleanup();
196
+ if (signal) {
197
+ reject(new types_1.SynthesisError(`CDK synthesis terminated by signal ${signal}`, stderr || stdout || 'No output captured'));
198
+ }
199
+ else if (code !== 0) {
200
+ reject(new types_1.SynthesisError(`CDK synthesis failed with exit code ${code}`, stderr || stdout || 'No output captured'));
201
+ }
202
+ else {
203
+ resolve();
204
+ }
205
+ }
206
+ });
207
+ });
208
+ }
209
+ /**
210
+ * Find all CloudFormation templates in output directory
211
+ */
212
+ async findTemplates(outputPath) {
213
+ try {
214
+ const files = await fs.readdir(outputPath);
215
+ const templatePaths = [];
216
+ const stackNames = [];
217
+ for (const file of files) {
218
+ // Match CloudFormation template files (stack-name.template.json or stack-name.template.yaml)
219
+ if (file.endsWith('.template.json') ||
220
+ file.endsWith('.template.yaml') ||
221
+ file.endsWith('.template.yml')) {
222
+ const fullPath = path.join(outputPath, file);
223
+ templatePaths.push(fullPath);
224
+ // Extract stack name from filename
225
+ const stackName = file
226
+ .replace('.template.json', '')
227
+ .replace('.template.yaml', '')
228
+ .replace('.template.yml', '');
229
+ stackNames.push(stackName);
230
+ }
231
+ }
232
+ if (templatePaths.length === 0) {
233
+ throw new Error('No CloudFormation templates found in output directory');
234
+ }
235
+ return { templatePaths, stackNames };
236
+ }
237
+ catch (error) {
238
+ throw new Error(`Failed to find templates: ${error instanceof Error ? error.message : String(error)}`);
239
+ }
240
+ }
241
+ }
242
+ exports.SynthesisOrchestrator = SynthesisOrchestrator;
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ludGhlc2lzT3JjaGVzdHJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bnRoZXNpcy9TeW50aGVzaXNPcmNoZXN0cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQXNDO0FBQ3RDLGdEQUFrQztBQUNsQywyQ0FBNkI7QUFDN0IsbUNBQTRFO0FBRTVFLE1BQWEscUJBQXFCO0lBQ2YsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBRWpEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUF5QjtRQUN4QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUM7WUFFekQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUV0RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDakUsTUFBTSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFL0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUV4QyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLGFBQWE7Z0JBQ2IsVUFBVTtnQkFDVixRQUFRO2FBQ1QsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFP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O29CQUM3QyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUU3QixtQ0FBbUM7b0JBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUk7eUJBQ25CLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7eUJBQzdCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7eUJBQzdCLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUVELE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDdEYsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFuUUQsc0RBbVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTeW50aGVzaXNPcHRpb25zLCBTeW50aGVzaXNSZXN1bHQsIFN5bnRoZXNpc0Vycm9yIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBTeW50aGVzaXNPcmNoZXN0cmF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfT1VUUFVUX1BBVEggPSAnY2RrLm91dCc7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQ0RLIHN5bnRoZXNpc1xuICAgKi9cbiAgYXN5bmMgc3ludGhlc2l6ZShvcHRpb25zOiBTeW50aGVzaXNPcHRpb25zKTogUHJvbWlzZTxTeW50aGVzaXNSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBvcHRpb25zLm91dHB1dFBhdGggfHwgdGhpcy5ERUZBVUxUX09VVFBVVF9QQVRIO1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY3VzdG9tQ29tbWFuZCB8fCAnbnB4IGNkayBzeW50aCc7XG5cbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVN5bnRoZXNpcyhjb21tYW5kLCBvcHRpb25zLmNka0FwcFBhdGgsIG9wdGlvbnMuY29udGV4dCwgb3V0cHV0UGF0aCk7XG5cbiAgICAgIGNvbnN0IGZ1bGxPdXRwdXRQYXRoID0gcGF0aC5qb2luKG9wdGlvbnMuY2RrQXBwUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICBjb25zdCB7IHRlbXBsYXRlUGF0aHMsIHN0YWNrTmFtZXMgfSA9IGF3YWl0IHRoaXMuZmluZFRlbXBsYXRlcyhmdWxsT3V0cHV0UGF0aCk7XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgdGVtcGxhdGVQYXRocyxcbiAgICAgICAgc3RhY2tOYW1lcyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRoZXNpc0Vycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgdGVtcGxhdGVQYXRoczogW10sXG4gICAgICAgICAgc3RhY2tOYW1lczogW10sXG4gICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHRlbXBsYXRlUGF0aHM6IFtdLFxuICAgICAgICBzdGFja05hbWVzOiBbXSxcbiAgICAgICAgZXJyb3I6IGBTeW50aGVzaXMgZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgc3ludGhlc2lzIGNvbW1hbmRcbiAgICpcbiAgICogVXNlcyBzaGVsbDogZmFsc2UgZm9yIHNlY3VyaXR5IHRvIHByZXZlbnQgY29tbWFuZCBpbmplY3Rpb24gYXR0YWNrcy5cbiAgICogQXJndW1lbnRzIGFyZSBwYXNzZWQgYXMgYW4gYXJyYXkgdG8gYXZvaWQgc2hlbGwgaW50ZXJwcmV0YXRpb24uXG4gICAqIFxuICAgKiBJbXBsZW1lbnRzIGEgMTUtc2Vjb25kIHRpbWVvdXQgdG8gcHJldmVudCBoYW5naW5nIHByb2Nlc3NlcyBpbiBDSTpcbiAgICogLSBTZW5kcyBTSUdURVJNIGZvciBncmFjZWZ1bCB0ZXJtaW5hdGlvblxuICAgKiAtIEZvbGxvd3MgdXAgd2l0aCBTSUdLSUxMIGFmdGVyIDEgc2Vjb25kIGlmIHByb2Nlc3MgZG9lc24ndCBleGl0XG4gICAqIC0gUHJldmVudHMgZHVwbGljYXRlIHJlc29sdXRpb24gdXNpbmcgaXNSZXNvbHZlZCBmbGFnXG4gICAqIC0gRW5zdXJlcyBhbGwgZXZlbnQgbGlzdGVuZXJzIGFyZSBjbGVhbmVkIHVwXG4gICAqIC0gVXNlcyBwcm9jZXNzLmtpbGwgYXMgZmFsbGJhY2sgZm9yIHN0dWJib3JuIHByb2Nlc3Nlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3ludGhlc2lzKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBjZGtBcHBQYXRoOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgb3V0cHV0UGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IFtjbWQsIC4uLmFyZ3NdID0gY29tbWFuZC5zcGxpdCgnICcpO1xuXG4gICAgICAvLyBBZGQgY29udGV4dCBhcmd1bWVudHNcbiAgICAgIGNvbnN0IGFsbEFyZ3MgPSBbLi4uYXJnc107XG4gICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb250ZXh0KSkge1xuICAgICAgICAgIGFsbEFyZ3MucHVzaCgnLWMnLCBgJHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIG91dHB1dCBwYXRoIGlmIHNwZWNpZmllZFxuICAgICAgaWYgKG91dHB1dFBhdGgpIHtcbiAgICAgICAgYWxsQXJncy5wdXNoKCctLW91dHB1dCcsIG91dHB1dFBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2Ugc2hlbGw6IGZhbHNlIGZvciBzZWN1cml0eSBhbmQgcGFzcyBhcmd1bWVudHMgcHJvcGVybHlcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjbWQsIGFsbEFyZ3MsIHtcbiAgICAgICAgY3dkOiBjZGtBcHBQYXRoLFxuICAgICAgICBzaGVsbDogZmFsc2UsXG4gICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgICAgZGV0YWNoZWQ6IGZhbHNlLCAvLyBFbnN1cmUgcHJvY2VzcyBpcyBwYXJ0IG9mIHRoZSBzYW1lIHByb2Nlc3MgZ3JvdXBcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBsZXQgaXNSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgbGV0IGtpbGxUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoa2lsbFRpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoa2lsbFRpbWVvdXQpO1xuICAgICAgICAgIGtpbGxUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBwcm9jLnN0ZG91dD8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHByb2Muc3RkZXJyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZvcmNlS2lsbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUcnkgbXVsdGlwbGUga2lsbCBtZXRob2RzIGZvciBzdHViYm9ybiBwcm9jZXNzZXNcbiAgICAgICAgICBpZiAocHJvYy5waWQgJiYgIXByb2Mua2lsbGVkKSB7XG4gICAgICAgICAgICBwcm9jLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgIC8vIEFsc28gdHJ5IHByb2Nlc3Mua2lsbCBhcyBmYWxsYmFja1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2MucGlkLCAnU0lHS0lMTCcpO1xuICAgICAgICAgICAgfSBjYXRjaCAoa2lsbEVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBraWxsIGVycm9ycyAtIHByb2Nlc3MgbWlnaHQgYWxyZWFkeSBiZSBkZWFkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgZHVyaW5nIGZvcmNlIGtpbGxcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gU2V0IHVwIHRpbWVvdXQgdG8gcHJldmVudCBoYW5naW5nIHByb2Nlc3Nlc1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIWlzUmVzb2x2ZWQpIHtcbiAgICAgICAgICBpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGaXJzdCB0cnkgZ3JhY2VmdWwgdGVybWluYXRpb25cbiAgICAgICAgICBwcm9jLmtpbGwoJ1NJR1RFUk0nKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGb3JjZSBraWxsIGFmdGVyIDEgc2Vjb25kIGlmIHN0aWxsIHJ1bm5pbmdcbiAgICAgICAgICBraWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZm9yY2VLaWxsKCk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgXG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgIG5ldyBTeW50aGVzaXNFcnJvcihcbiAgICAgICAgICAgICAgJ0NESyBzeW50aGVzaXMgdGltZWQgb3V0IGFmdGVyIDE1IHNlY29uZHMnLFxuICAgICAgICAgICAgICBzdGRlcnIgfHwgc3Rkb3V0IHx8ICdObyBvdXRwdXQgY2FwdHVyZWQnLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LCAxNTAwMCk7IC8vIFJlZHVjZWQgdG8gMTUgc2Vjb25kIHRpbWVvdXRcblxuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKCFpc1Jlc29sdmVkKSB7XG4gICAgICAgICAgaXNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgU3ludGhlc2lzRXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSBzeW50aGVzaXMgY29tbWFuZDogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIHN0ZGVyciB8fCAnTm8gZXJyb3Igb3V0cHV0IGNhcHR1cmVkJyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCFpc1Jlc29sdmVkKSB7XG4gICAgICAgICAgaXNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICBuZXcgU3ludGhlc2lzRXJyb3IoXG4gICAgICAgICAgICAgICAgYENESyBzeW50aGVzaXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gLFxuICAgICAgICAgICAgICAgIHN0ZGVyciB8fCBzdGRvdXQgfHwgJ05vIG91dHB1dCBjYXB0dXJlZCcsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkaXRpb25hbCBzYWZldHk6IGhhbmRsZSBwcm9jZXNzIGV4aXRcbiAgICAgIHByb2Mub24oJ2V4aXQnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICghaXNSZXNvbHZlZCkge1xuICAgICAgICAgIGlzUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICBuZXcgU3ludGhlc2lzRXJyb3IoXG4gICAgICAgICAgICAgICAgYENESyBzeW50aGVzaXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtzaWduYWx9YCxcbiAgICAgICAgICAgICAgICBzdGRlcnIgfHwgc3Rkb3V0IHx8ICdObyBvdXRwdXQgY2FwdHVyZWQnLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgbmV3IFN5bnRoZXNpc0Vycm9yKFxuICAgICAgICAgICAgICAgIGBDREsgc3ludGhlc2lzIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9YCxcbiAgICAgICAgICAgICAgICBzdGRlcnIgfHwgc3Rkb3V0IHx8ICdObyBvdXRwdXQgY2FwdHVyZWQnLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbGwgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzIGluIG91dHB1dCBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFRlbXBsYXRlcyhcbiAgICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0ZW1wbGF0ZVBhdGhzOiBzdHJpbmdbXTsgc3RhY2tOYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIob3V0cHV0UGF0aCk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBzdGFja05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgLy8gTWF0Y2ggQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZmlsZXMgKHN0YWNrLW5hbWUudGVtcGxhdGUuanNvbiBvciBzdGFjay1uYW1lLnRlbXBsYXRlLnlhbWwpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlLmVuZHNXaXRoKCcudGVtcGxhdGUuanNvbicpIHx8XG4gICAgICAgICAgZmlsZS5lbmRzV2l0aCgnLnRlbXBsYXRlLnlhbWwnKSB8fFxuICAgICAgICAgIGZpbGUuZW5kc1dpdGgoJy50ZW1wbGF0ZS55bWwnKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihvdXRwdXRQYXRoLCBmaWxlKTtcbiAgICAgICAgICB0ZW1wbGF0ZVBhdGhzLnB1c2goZnVsbFBhdGgpO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCBzdGFjayBuYW1lIGZyb20gZmlsZW5hbWVcbiAgICAgICAgICBjb25zdCBzdGFja05hbWUgPSBmaWxlXG4gICAgICAgICAgICAucmVwbGFjZSgnLnRlbXBsYXRlLmpzb24nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCcudGVtcGxhdGUueWFtbCcsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJy50ZW1wbGF0ZS55bWwnLCAnJyk7XG4gICAgICAgICAgc3RhY2tOYW1lcy5wdXNoKHN0YWNrTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRlbXBsYXRlUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzIGZvdW5kIGluIG91dHB1dCBkaXJlY3RvcnknKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgdGVtcGxhdGVQYXRocywgc3RhY2tOYW1lcyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZmluZCB0ZW1wbGF0ZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './SynthesisOrchestrator';
2
+ export * from './types';
@@ -0,0 +1,19 @@
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
+ __exportStar(require("./SynthesisOrchestrator"), exports);
18
+ __exportStar(require("./types"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3ludGhlc2lzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwREFBd0M7QUFDeEMsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9TeW50aGVzaXNPcmNoZXN0cmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0=
@@ -0,0 +1,17 @@
1
+ export interface SynthesisOptions {
2
+ cdkAppPath: string;
3
+ outputPath?: string;
4
+ context?: Record<string, string>;
5
+ customCommand?: string;
6
+ }
7
+ export interface SynthesisResult {
8
+ success: boolean;
9
+ templatePaths: string[];
10
+ stackNames: string[];
11
+ error?: string;
12
+ duration: number;
13
+ }
14
+ export declare class SynthesisError extends Error {
15
+ cdkOutput: string;
16
+ constructor(message: string, cdkOutput: string);
17
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SynthesisError = void 0;
4
+ class SynthesisError extends Error {
5
+ cdkOutput;
6
+ constructor(message, cdkOutput) {
7
+ super(message);
8
+ this.cdkOutput = cdkOutput;
9
+ this.name = 'SynthesisError';
10
+ }
11
+ }
12
+ exports.SynthesisError = SynthesisError;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3ludGhlc2lzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLE1BQWEsY0FBZSxTQUFRLEtBQUs7SUFHOUI7SUFGVCxZQUNFLE9BQWUsRUFDUixTQUFpQjtRQUV4QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFGUixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBR3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBUkQsd0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpc09wdGlvbnMge1xuICBjZGtBcHBQYXRoOiBzdHJpbmc7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjdXN0b21Db21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpc1Jlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIHRlbXBsYXRlUGF0aHM6IHN0cmluZ1tdO1xuICBzdGFja05hbWVzOiBzdHJpbmdbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTeW50aGVzaXNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBjZGtPdXRwdXQ6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1N5bnRoZXNpc0Vycm9yJztcbiAgfVxufVxuIl19
@@ -0,0 +1,29 @@
1
+ import { ThresholdEvaluation } from './types';
2
+ import { ThresholdConfig } from '../config/types';
3
+ import { ResourceCost, ModifiedResourceCost } from '../pricing/types';
4
+ export declare class ThresholdEnforcer {
5
+ /**
6
+ * Evaluate cost delta against configured thresholds
7
+ */
8
+ evaluateThreshold(costDelta: number, addedResources: ResourceCost[], modifiedResources: ModifiedResourceCost[], config?: ThresholdConfig, environment?: string): ThresholdEvaluation;
9
+ /**
10
+ * Select appropriate threshold based on environment
11
+ */
12
+ private selectThresholds;
13
+ /**
14
+ * Get top cost contributors sorted by impact
15
+ */
16
+ private getTopContributors;
17
+ /**
18
+ * Format error threshold message
19
+ */
20
+ private formatErrorMessage;
21
+ /**
22
+ * Format warning threshold message
23
+ */
24
+ private formatWarningMessage;
25
+ /**
26
+ * Get recommendations based on threshold level and contributors
27
+ */
28
+ private getRecommendations;
29
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThresholdEnforcer = void 0;
4
+ class ThresholdEnforcer {
5
+ /**
6
+ * Evaluate cost delta against configured thresholds
7
+ */
8
+ evaluateThreshold(costDelta, addedResources, modifiedResources, config, environment) {
9
+ if (!config) {
10
+ return {
11
+ passed: true,
12
+ level: 'none',
13
+ delta: costDelta,
14
+ message: 'No thresholds configured',
15
+ recommendations: [],
16
+ };
17
+ }
18
+ const thresholds = this.selectThresholds(config, environment);
19
+ if (!thresholds) {
20
+ return {
21
+ passed: true,
22
+ level: 'none',
23
+ delta: costDelta,
24
+ message: 'No thresholds configured',
25
+ recommendations: [],
26
+ };
27
+ }
28
+ // Check error threshold first
29
+ if (thresholds.error !== undefined && costDelta > thresholds.error) {
30
+ const topContributors = this.getTopContributors(addedResources, modifiedResources, 5);
31
+ return {
32
+ passed: false,
33
+ level: 'error',
34
+ threshold: thresholds.error,
35
+ delta: costDelta,
36
+ message: this.formatErrorMessage(costDelta, thresholds.error),
37
+ recommendations: this.getRecommendations('error', topContributors),
38
+ };
39
+ }
40
+ // Check warning threshold
41
+ if (thresholds.warning !== undefined && costDelta > thresholds.warning) {
42
+ const topContributors = this.getTopContributors(addedResources, modifiedResources, 5);
43
+ return {
44
+ passed: true,
45
+ level: 'warning',
46
+ threshold: thresholds.warning,
47
+ delta: costDelta,
48
+ message: this.formatWarningMessage(costDelta, thresholds.warning),
49
+ recommendations: this.getRecommendations('warning', topContributors),
50
+ };
51
+ }
52
+ return {
53
+ passed: true,
54
+ level: 'none',
55
+ delta: costDelta,
56
+ message: `Cost delta $${costDelta.toFixed(2)}/month is within thresholds`,
57
+ recommendations: [],
58
+ };
59
+ }
60
+ /**
61
+ * Select appropriate threshold based on environment
62
+ */
63
+ selectThresholds(config, environment) {
64
+ if (environment && config.environments?.[environment]) {
65
+ return config.environments[environment];
66
+ }
67
+ return config.default;
68
+ }
69
+ /**
70
+ * Get top cost contributors sorted by impact
71
+ */
72
+ getTopContributors(addedResources, modifiedResources, limit) {
73
+ const allContributors = [
74
+ ...addedResources,
75
+ ...modifiedResources.map((r) => ({
76
+ logicalId: r.logicalId,
77
+ type: r.type,
78
+ monthlyCost: {
79
+ amount: r.costDelta,
80
+ currency: r.newMonthlyCost.currency,
81
+ confidence: r.newMonthlyCost.confidence,
82
+ assumptions: r.newMonthlyCost.assumptions,
83
+ },
84
+ })),
85
+ ];
86
+ return allContributors
87
+ .sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount)
88
+ .slice(0, limit);
89
+ }
90
+ /**
91
+ * Format error threshold message
92
+ */
93
+ formatErrorMessage(delta, threshold) {
94
+ const exceededBy = delta - threshold;
95
+ const percentage = ((exceededBy / threshold) * 100).toFixed(1);
96
+ return `Cost increase of $${delta.toFixed(2)}/month exceeds error threshold of $${threshold.toFixed(2)}/month by $${exceededBy.toFixed(2)} (${percentage}%)`;
97
+ }
98
+ /**
99
+ * Format warning threshold message
100
+ */
101
+ formatWarningMessage(delta, threshold) {
102
+ const exceededBy = delta - threshold;
103
+ const percentage = ((exceededBy / threshold) * 100).toFixed(1);
104
+ return `Cost increase of $${delta.toFixed(2)}/month exceeds warning threshold of $${threshold.toFixed(2)}/month by $${exceededBy.toFixed(2)} (${percentage}%)`;
105
+ }
106
+ /**
107
+ * Get recommendations based on threshold level and contributors
108
+ */
109
+ getRecommendations(level, topContributors) {
110
+ const recommendations = [];
111
+ if (level === 'error') {
112
+ recommendations.push('This change cannot be merged without approval due to cost impact.');
113
+ recommendations.push('Review the cost breakdown and consider optimizations before proceeding.');
114
+ recommendations.push('Contact your FinOps team for threshold override approval if this cost increase is necessary.');
115
+ }
116
+ else {
117
+ recommendations.push('Review this cost increase with your team before merging.');
118
+ recommendations.push('Consider whether all resources in this change are necessary.');
119
+ }
120
+ if (topContributors.length > 0) {
121
+ recommendations.push(`Top cost contributors: ${topContributors
122
+ .map((r) => `${r.type} (${r.logicalId}): $${r.monthlyCost.amount.toFixed(2)}/month`)
123
+ .join(', ')}`);
124
+ // Specific recommendations based on resource types
125
+ const resourceTypes = new Set(topContributors.map((r) => r.type));
126
+ if (resourceTypes.has('AWS::RDS::DBInstance')) {
127
+ recommendations.push('Consider using smaller RDS instance types or Aurora Serverless for lower costs.');
128
+ }
129
+ if (resourceTypes.has('AWS::EC2::Instance')) {
130
+ recommendations.push('Consider using smaller EC2 instance types, Spot instances, or Savings Plans.');
131
+ }
132
+ if (resourceTypes.has('AWS::EC2::NatGateway')) {
133
+ recommendations.push('NAT Gateways have high data processing costs. Consider using VPC endpoints or consolidating NAT Gateways.');
134
+ }
135
+ if (resourceTypes.has('AWS::ElasticLoadBalancingV2::LoadBalancer')) {
136
+ recommendations.push('Load Balancers have hourly costs. Consider sharing load balancers across services if possible.');
137
+ }
138
+ }
139
+ return recommendations;
140
+ }
141
+ }
142
+ exports.ThresholdEnforcer = ThresholdEnforcer;
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhyZXNob2xkRW5mb3JjZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGhyZXNob2xkL1RocmVzaG9sZEVuZm9yY2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLE1BQWEsaUJBQWlCO0lBQzVCOztPQUVHO0lBQ0gsaUJBQWlCLENBQ2YsU0FBaUIsRUFDakIsY0FBOEIsRUFDOUIsaUJBQXlDLEVBQ3pDLE1BQXdCLEVBQ3hCLFdBQW9CO1FBRXBCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLElBQUk7Z0JBQ1osS0FBSyxFQUFFLE1BQU07Z0JBQ2IsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLE9BQU8sRUFBRSwwQkFBMEI7Z0JBQ25DLGVBQWUsRUFBRSxFQUFFO2FBQ3BCLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTztnQkFDTCxNQUFNLEVBQUUsSUFBSTtnQkFDWixLQUFLLEVBQUUsTUFBTTtnQkFDYixLQUFLLEVBQUUsU0FBUztnQkFDaEIsT0FBTyxFQUFFLDBCQUEwQjtnQkFDbkMsZUFBZSxFQUFFLEVBQUU7YUFDcEIsQ0FBQztRQUNKLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxVQUFVLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25FLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDN0MsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixDQUFDLENBQ0YsQ0FBQztZQUVGLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLFVBQVUsQ0FBQyxL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aUJBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7aUJBQ25GLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNoQixDQUFDO1lBRUYsbURBQW1EO1lBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRWxFLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLGlGQUFpRixDQUNsRixDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLDhFQUE4RSxDQUMvRSxDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLDJHQUEyRyxDQUM1RyxDQUFDO1lBQ0osQ0FBQztZQUVELElBQ0UsYUFBYSxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxFQUM5RCxDQUFDO2dCQUNELGVBQWUsQ0FBQyxJQUFJLENBQ2xCLGdHQUFnRyxDQUNqRyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUE3TUQsOENBNk1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhyZXNob2xkRXZhbHVhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVGhyZXNob2xkQ29uZmlnLCBUaHJlc2hvbGRMZXZlbHMgfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0LCBNb2RpZmllZFJlc291cmNlQ29zdCB9IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGhyZXNob2xkRW5mb3JjZXIge1xuICAvKipcbiAgICogRXZhbHVhdGUgY29zdCBkZWx0YSBhZ2FpbnN0IGNvbmZpZ3VyZWQgdGhyZXNob2xkc1xuICAgKi9cbiAgZXZhbHVhdGVUaHJlc2hvbGQoXG4gICAgY29zdERlbHRhOiBudW1iZXIsXG4gICAgYWRkZWRSZXNvdXJjZXM6IFJlc291cmNlQ29zdFtdLFxuICAgIG1vZGlmaWVkUmVzb3VyY2VzOiBNb2RpZmllZFJlc291cmNlQ29zdFtdLFxuICAgIGNvbmZpZz86IFRocmVzaG9sZENvbmZpZyxcbiAgICBlbnZpcm9ubWVudD86IHN0cmluZyxcbiAgKTogVGhyZXNob2xkRXZhbHVhdGlvbiB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhc3NlZDogdHJ1ZSxcbiAgICAgICAgbGV2ZWw6ICdub25lJyxcbiAgICAgICAgZGVsdGE6IGNvc3REZWx0YSxcbiAgICAgICAgbWVzc2FnZTogJ05vIHRocmVzaG9sZHMgY29uZmlndXJlZCcsXG4gICAgICAgIHJlY29tbWVuZGF0aW9uczogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRocmVzaG9sZHMgPSB0aGlzLnNlbGVjdFRocmVzaG9sZHMoY29uZmlnLCBlbnZpcm9ubWVudCk7XG5cbiAgICBpZiAoIXRocmVzaG9sZHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhc3NlZDogdHJ1ZSxcbiAgICAgICAgbGV2ZWw6ICdub25lJyxcbiAgICAgICAgZGVsdGE6IGNvc3REZWx0YSxcbiAgICAgICAgbWVzc2FnZTogJ05vIHRocmVzaG9sZHMgY29uZmlndXJlZCcsXG4gICAgICAgIHJlY29tbWVuZGF0aW9uczogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGVycm9yIHRocmVzaG9sZCBmaXJzdFxuICAgIGlmICh0aHJlc2hvbGRzLmVycm9yICE9PSB1bmRlZmluZWQgJiYgY29zdERlbHRhID4gdGhyZXNob2xkcy5lcnJvcikge1xuICAgICAgY29uc3QgdG9wQ29udHJpYnV0b3JzID0gdGhpcy5nZXRUb3BDb250cmlidXRvcnMoXG4gICAgICAgIGFkZGVkUmVzb3VyY2VzLFxuICAgICAgICBtb2RpZmllZFJlc291cmNlcyxcbiAgICAgICAgNSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhc3NlZDogZmFsc2UsXG4gICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZHMuZXJyb3IsXG4gICAgICAgIGRlbHRhOiBjb3N0RGVsdGEsXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMuZm9ybWF0RXJyb3JNZXNzYWdlKGNvc3REZWx0YSwgdGhyZXNob2xkcy5lcnJvciksXG4gICAgICAgIHJlY29tbWVuZGF0aW9uczogdGhpcy5nZXRSZWNvbW1lbmRhdGlvbnMoJ2Vycm9yJywgdG9wQ29udHJpYnV0b3JzKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2FybmluZyB0aHJlc2hvbGRcbiAgICBpZiAodGhyZXNob2xkcy53YXJuaW5nICE9PSB1bmRlZmluZWQgJiYgY29zdERlbHRhID4gdGhyZXNob2xkcy53YXJuaW5nKSB7XG4gICAgICBjb25zdCB0b3BDb250cmlidXRvcnMgPSB0aGlzLmdldFRvcENvbnRyaWJ1dG9ycyhcbiAgICAgICAgYWRkZWRSZXNvdXJjZXMsXG4gICAgICAgIG1vZGlmaWVkUmVzb3VyY2VzLFxuICAgICAgICA1LFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFzc2VkOiB0cnVlLFxuICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZHMud2FybmluZyxcbiAgICAgICAgZGVsdGE6IGNvc3REZWx0YSxcbiAgICAgICAgbWVzc2FnZTogdGhpcy5mb3JtYXRXYXJuaW5nTWVzc2FnZShjb3N0RGVsdGEsIHRocmVzaG9sZHMud2FybmluZyksXG4gICAgICAgIHJlY29tbWVuZGF0aW9uczogdGhpcy5nZXRSZWNvbW1lbmRhdGlvbnMoJ3dhcm5pbmcnLCB0b3BDb250cmlidXRvcnMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFzc2VkOiB0cnVlLFxuICAgICAgbGV2ZWw6ICdub25lJyxcbiAgICAgIGRlbHRhOiBjb3N0RGVsdGEsXG4gICAgICBtZXNzYWdlOiBgQ29zdCBkZWx0YSAkJHtjb3N0RGVsdGEudG9GaXhlZCgyKX0vbW9udGggaXMgd2l0aGluIHRocmVzaG9sZHNgLFxuICAgICAgcmVjb21tZW5kYXRpb25zOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhcHByb3ByaWF0ZSB0aHJlc2hvbGQgYmFzZWQgb24gZW52aXJvbm1lbnRcbiAgICovXG4gIHByaXZhdGUgc2VsZWN0VGhyZXNob2xkcyhcbiAgICBjb25maWc6IFRocmVzaG9sZENvbmZpZyxcbiAgICBlbnZpcm9ubWVudD86IHN0cmluZyxcbiAgKTogVGhyZXNob2xkTGV2ZWxzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZW52aXJvbm1lbnQgJiYgY29uZmlnLmVudmlyb25tZW50cz8uW2Vudmlyb25tZW50XSkge1xuICAgICAgcmV0dXJuIGNvbmZpZy5lbnZpcm9ubWVudHNbZW52aXJvbm1lbnRdO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmRlZmF1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRvcCBjb3N0IGNvbnRyaWJ1dG9ycyBzb3J0ZWQgYnkgaW1wYWN0XG4gICAqL1xuICBwcml2YXRlIGdldFRvcENvbnRyaWJ1dG9ycyhcbiAgICBhZGRlZFJlc291cmNlczogUmVzb3VyY2VDb3N0W10sXG4gICAgbW9kaWZpZWRSZXNvdXJjZXM6IE1vZGlmaWVkUmVzb3VyY2VDb3N0W10sXG4gICAgbGltaXQ6IG51bWJlcixcbiAgKTogUmVzb3VyY2VDb3N0W10ge1xuICAgIGNvbnN0IGFsbENvbnRyaWJ1dG9yczogUmVzb3VyY2VDb3N0W10gPSBbXG4gICAgICAuLi5hZGRlZFJlc291cmNlcyxcbiAgICAgIC4uLm1vZGlmaWVkUmVzb3VyY2VzLm1hcCgocikgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBtb250aGx5Q29zdDoge1xuICAgICAgICAgIGFtb3VudDogci5jb3N0RGVsdGEsXG4gICAgICAgICAgY3VycmVuY3k6IHIubmV3TW9udGhseUNvc3QuY3VycmVuY3ksXG4gICAgICAgICAgY29uZmlkZW5jZTogci5uZXdNb250aGx5Q29zdC5jb25maWRlbmNlLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiByLm5ld01vbnRobHlDb3N0LmFzc3VtcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgIF07XG5cbiAgICByZXR1cm4gYWxsQ29udHJpYnV0b3JzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5tb250aGx5Q29zdC5hbW91bnQgLSBhLm1vbnRobHlDb3N0LmFtb3VudClcbiAgICAgIC5zbGljZSgwLCBsaW1pdCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGVycm9yIHRocmVzaG9sZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEVycm9yTWVzc2FnZShkZWx0YTogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZXhjZWVkZWRCeSA9IGRlbHRhIC0gdGhyZXNob2xkO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKGV4Y2VlZGVkQnkgLyB0aHJlc2hvbGQpICogMTAwKS50b0ZpeGVkKDEpO1xuXG4gICAgcmV0dXJuIGBDb3N0IGluY3JlYXNlIG9mICQke2RlbHRhLnRvRml4ZWQoMil9L21vbnRoIGV4Y2VlZHMgZXJyb3IgdGhyZXNob2xkIG9mICQke3RocmVzaG9sZC50b0ZpeGVkKDIpfS9tb250aCBieSAkJHtleGNlZWRlZEJ5LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB3YXJuaW5nIHRocmVzaG9sZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFdhcm5pbmdNZXNzYWdlKGRlbHRhOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBleGNlZWRlZEJ5ID0gZGVsdGEgLSB0aHJlc2hvbGQ7XG4gICAgY29uc3QgcGVyY2VudGFnZSA9ICgoZXhjZWVkZWRCeSAvIHRocmVzaG9sZCkgKiAxMDApLnRvRml4ZWQoMSk7XG5cbiAgICByZXR1cm4gYENvc3QgaW5jcmVhc2Ugb2YgJCR7ZGVsdGEudG9GaXhlZCgyKX0vbW9udGggZXhjZWVkcyB3YXJuaW5nIHRocmVzaG9sZCBvZiAkJHt0aHJlc2hvbGQudG9GaXhlZCgyKX0vbW9udGggYnkgJCR7ZXhjZWVkZWRCeS50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHRocmVzaG9sZCBsZXZlbCBhbmQgY29udHJpYnV0b3JzXG4gICAqL1xuICBwcml2YXRlIGdldFJlY29tbWVuZGF0aW9ucyhcbiAgICBsZXZlbDogJ3dhcm5pbmcnIHwgJ2Vycm9yJyxcbiAgICB0b3BDb250cmlidXRvcnM6IFJlc291cmNlQ29zdFtdLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChcbiAgICAgICAgJ1RoaXMgY2hhbmdlIGNhbm5vdCBiZSBtZXJnZWQgd2l0aG91dCBhcHByb3ZhbCBkdWUgdG8gY29zdCBpbXBhY3QuJyxcbiAgICAgICk7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChcbiAgICAgICAgJ1JldmlldyB0aGUgY29zdCBicmVha2Rvd24gYW5kIGNvbnNpZGVyIG9wdGltaXphdGlvbnMgYmVmb3JlIHByb2NlZWRpbmcuJyxcbiAgICAgICk7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChcbiAgICAgICAgJ0NvbnRhY3QgeW91ciBGaW5PcHMgdGVhbSBmb3IgdGhyZXNob2xkIG92ZXJyaWRlIGFwcHJvdmFsIGlmIHRoaXMgY29zdCBpbmNyZWFzZSBpcyBuZWNlc3NhcnkuJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29tbWVuZGF0aW9ucy5wdXNoKFxuICAgICAgICAnUmV2aWV3IHRoaXMgY29zdCBpbmNyZWFzZSB3aXRoIHlvdXIgdGVhbSBiZWZvcmUgbWVyZ2luZy4nLFxuICAgICAgKTtcbiAgICAgIHJlY29tbWVuZGF0aW9ucy5wdXNoKFxuICAgICAgICAnQ29uc2lkZXIgd2hldGhlciBhbGwgcmVzb3VyY2VzIGluIHRoaXMgY2hhbmdlIGFyZSBuZWNlc3NhcnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRvcENvbnRyaWJ1dG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChcbiAgICAgICAgYFRvcCBjb3N0IGNvbnRyaWJ1dG9yczogJHt0b3BDb250cmlidXRvcnNcbiAgICAgICAgICAubWFwKChyKSA9PiBgJHtyLnR5cGV9ICgke3IubG9naWNhbElkfSk6ICQke3IubW9udGhseUNvc3QuYW1vdW50LnRvRml4ZWQoMil9L21vbnRoYClcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcblxuICAgICAgLy8gU3BlY2lmaWMgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHJlc291cmNlIHR5cGVzXG4gICAgICBjb25zdCByZXNvdXJjZVR5cGVzID0gbmV3IFNldCh0b3BDb250cmlidXRvcnMubWFwKChyKSA9PiByLnR5cGUpKTtcblxuICAgICAgaWYgKHJlc291cmNlVHlwZXMuaGFzKCdBV1M6OlJEUzo6REJJbnN0YW5jZScpKSB7XG4gICAgICAgIHJlY29tbWVuZGF0aW9ucy5wdXNoKFxuICAgICAgICAgICdDb25zaWRlciB1c2luZyBzbWFsbGVyIFJEUyBpbnN0YW5jZSB0eXBlcyBvciBBdXJvcmEgU2VydmVybGVzcyBmb3IgbG93ZXIgY29zdHMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlVHlwZXMuaGFzKCdBV1M6OkVDMjo6SW5zdGFuY2UnKSkge1xuICAgICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChcbiAgICAgICAgICAnQ29uc2lkZXIgdXNpbmcgc21hbGxlciBFQzIgaW5zdGFuY2UgdHlwZXMsIFNwb3QgaW5zdGFuY2VzLCBvciBTYXZpbmdzIFBsYW5zLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZVR5cGVzLmhhcygnQVdTOjpFQzI6Ok5hdEdhdGV3YXknKSkge1xuICAgICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChcbiAgICAgICAgICAnTkFUIEdhdGV3YXlzIGhhdmUgaGlnaCBkYXRhIHByb2Nlc3NpbmcgY29zdHMuIENvbnNpZGVyIHVzaW5nIFZQQyBlbmRwb2ludHMgb3IgY29uc29saWRhdGluZyBOQVQgR2F0ZXdheXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICByZXNvdXJjZVR5cGVzLmhhcygnQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMb2FkQmFsYW5jZXInKVxuICAgICAgKSB7XG4gICAgICAgIHJlY29tbWVuZGF0aW9ucy5wdXNoKFxuICAgICAgICAgICdMb2FkIEJhbGFuY2VycyBoYXZlIGhvdXJseSBjb3N0cy4gQ29uc2lkZXIgc2hhcmluZyBsb2FkIGJhbGFuY2VycyBhY3Jvc3Mgc2VydmljZXMgaWYgcG9zc2libGUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb21tZW5kYXRpb25zO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './ThresholdEnforcer';
2
+ export * from './types';
@@ -0,0 +1,19 @@
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
+ __exportStar(require("./ThresholdEnforcer"), exports);
18
+ __exportStar(require("./types"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGhyZXNob2xkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzREFBb0M7QUFDcEMsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9UaHJlc2hvbGRFbmZvcmNlcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import { ResourceCost } from '../pricing/types';
2
+ export interface ThresholdEvaluation {
3
+ passed: boolean;
4
+ level: 'none' | 'warning' | 'error';
5
+ threshold?: number;
6
+ delta: number;
7
+ message: string;
8
+ recommendations: string[];
9
+ }
10
+ export declare class ThresholdExceededError extends Error {
11
+ threshold: number;
12
+ actualDelta: number;
13
+ topContributors: ResourceCost[];
14
+ constructor(message: string, threshold: number, actualDelta: number, topContributors: ResourceCost[]);
15
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThresholdExceededError = void 0;
4
+ class ThresholdExceededError extends Error {
5
+ threshold;
6
+ actualDelta;
7
+ topContributors;
8
+ constructor(message, threshold, actualDelta, topContributors) {
9
+ super(message);
10
+ this.threshold = threshold;
11
+ this.actualDelta = actualDelta;
12
+ this.topContributors = topContributors;
13
+ this.name = 'ThresholdExceededError';
14
+ }
15
+ }
16
+ exports.ThresholdExceededError = ThresholdExceededError;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGhyZXNob2xkL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVdBLE1BQWEsc0JBQXVCLFNBQVEsS0FBSztJQUd0QztJQUNBO0lBQ0E7SUFKVCxZQUNFLE9BQWUsRUFDUixTQUFpQixFQUNqQixXQUFtQixFQUNuQixlQUErQjtRQUV0QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFKUixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUd0QyxJQUFJLENBQUMsSUFBSSxHQUFHLHdCQUF3QixDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQVZELHdEQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzb3VyY2VDb3N0IH0gZnJvbSAnLi4vcHJpY2luZy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZXNob2xkRXZhbHVhdGlvbiB7XG4gIHBhc3NlZDogYm9vbGVhbjtcbiAgbGV2ZWw6ICdub25lJyB8ICd3YXJuaW5nJyB8ICdlcnJvcic7XG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgZGVsdGE6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICByZWNvbW1lbmRhdGlvbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgVGhyZXNob2xkRXhjZWVkZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICBwdWJsaWMgYWN0dWFsRGVsdGE6IG51bWJlcixcbiAgICBwdWJsaWMgdG9wQ29udHJpYnV0b3JzOiBSZXNvdXJjZUNvc3RbXSxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1RocmVzaG9sZEV4Y2VlZGVkRXJyb3InO1xuICB9XG59XG4iXX0=