cdk-cost-analyzer 0.1.10 → 0.1.11

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 (46) hide show
  1. package/.cdk-cost-analyzer-cache/metadata.json +26 -2
  2. package/.kiro/specs/single-template-analysis/tasks.md +67 -54
  3. package/README.md +31 -1
  4. package/dist/analysis/SingleTemplateAnalyzer.d.ts +23 -0
  5. package/dist/analysis/SingleTemplateAnalyzer.js +168 -0
  6. package/dist/analysis/index.d.ts +1 -0
  7. package/dist/analysis/index.js +6 -0
  8. package/dist/api/index.d.ts +24 -0
  9. package/dist/api/index.js +56 -1
  10. package/dist/api/single-template-types.d.ts +83 -0
  11. package/dist/api/single-template-types.js +3 -0
  12. package/dist/cli/index.js +43 -54
  13. package/dist/pricing/calculators/LambdaCalculator.d.ts +2 -0
  14. package/dist/pricing/calculators/LambdaCalculator.js +48 -1
  15. package/dist/releasetag.txt +1 -1
  16. package/dist/reporter/SingleTemplateReporter.d.ts +31 -0
  17. package/dist/reporter/SingleTemplateReporter.js +186 -0
  18. package/dist/reporter/index.d.ts +1 -0
  19. package/dist/reporter/index.js +4 -2
  20. package/docs/SINGLE-TEMPLATE-ANALYSIS.md +372 -0
  21. package/examples/single-template-usage.js +208 -0
  22. package/package.json +1 -1
  23. package/test-cdk-project/README-COMPUTE.md +0 -141
  24. package/test-cdk-project/README.md +0 -95
  25. package/test-cdk-project/app-with-compute.js +0 -102
  26. package/test-cdk-project/app.js +0 -81
  27. package/test-cdk-project/cdk-compute.json +0 -3
  28. package/test-cdk-project/cdk.context.json +0 -7
  29. package/test-cdk-project/cdk.json +0 -3
  30. package/test-cdk-project/cdk.out/TestStack.assets.json +0 -21
  31. package/test-cdk-project/cdk.out/TestStack.template.json +0 -115
  32. package/test-cdk-project/cdk.out/cdk.out +0 -1
  33. package/test-cdk-project/cdk.out/manifest.json +0 -503
  34. package/test-cdk-project/cdk.out/tree.json +0 -1
  35. package/test-cdk-project/cdk.out.base/TestStack.assets.json +0 -21
  36. package/test-cdk-project/cdk.out.base/TestStack.template.json +0 -115
  37. package/test-cdk-project/cdk.out.base/cdk.out +0 -1
  38. package/test-cdk-project/cdk.out.base/manifest.json +0 -503
  39. package/test-cdk-project/cdk.out.base/tree.json +0 -1
  40. package/test-cdk-project/cdk.out.target/TestStack.assets.json +0 -21
  41. package/test-cdk-project/cdk.out.target/TestStack.template.json +0 -183
  42. package/test-cdk-project/cdk.out.target/cdk.out +0 -1
  43. package/test-cdk-project/cdk.out.target/manifest.json +0 -521
  44. package/test-cdk-project/cdk.out.target/tree.json +0 -1
  45. package/test-cdk-project/package-lock.json +0 -422
  46. package/test-cdk-project/package.json +0 -17
@@ -1,5 +1,7 @@
1
1
  import { AnalyzeOptions, CostAnalysisResult } from './types';
2
+ import { AnalyzeSingleTemplateOptions, SingleTemplateCostResult } from './single-template-types';
2
3
  export * from './types';
4
+ export * from './single-template-types';
3
5
  export { TemplateParseError } from '../parser/TemplateParser';
4
6
  export { PricingAPIError, UnsupportedResourceError } from '../pricing/types';
5
7
  export * from '../integrations';
@@ -9,3 +11,25 @@ export * from '../synthesis';
9
11
  export * from '../threshold';
10
12
  export * from '../pipeline';
11
13
  export declare function analyzeCosts(options: AnalyzeOptions): Promise<CostAnalysisResult>;
14
+ /**
15
+ * Analyze a single CloudFormation template for estimated monthly costs
16
+ *
17
+ * @param options - Configuration options including template content, region, format, and analysis config
18
+ * @returns Promise resolving to detailed cost analysis result
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const result = await analyzeSingleTemplate({
23
+ * template: fs.readFileSync('template.json', 'utf-8'),
24
+ * region: 'us-east-1',
25
+ * format: 'text',
26
+ * config: {
27
+ * usageAssumptions: {
28
+ * lambda: { invocationsPerMonth: 1000000 }
29
+ * }
30
+ * }
31
+ * });
32
+ * console.log(result.summary);
33
+ * ```
34
+ */
35
+ export declare function analyzeSingleTemplate(options: AnalyzeSingleTemplateOptions): Promise<SingleTemplateCostResult>;
package/dist/api/index.js CHANGED
@@ -16,11 +16,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.UnsupportedResourceError = exports.PricingAPIError = exports.TemplateParseError = void 0;
18
18
  exports.analyzeCosts = analyzeCosts;
19
+ exports.analyzeSingleTemplate = analyzeSingleTemplate;
19
20
  const DiffEngine_1 = require("../diff/DiffEngine");
20
21
  const TemplateParser_1 = require("../parser/TemplateParser");
21
22
  const PricingService_1 = require("../pricing/PricingService");
22
23
  const Reporter_1 = require("../reporter/Reporter");
24
+ const SingleTemplateReporter_1 = require("../reporter/SingleTemplateReporter");
25
+ const SingleTemplateAnalyzer_1 = require("../analysis/SingleTemplateAnalyzer");
23
26
  __exportStar(require("./types"), exports);
27
+ __exportStar(require("./single-template-types"), exports);
24
28
  var TemplateParser_2 = require("../parser/TemplateParser");
25
29
  Object.defineProperty(exports, "TemplateParseError", { enumerable: true, get: function () { return TemplateParser_2.TemplateParseError; } });
26
30
  var types_1 = require("../pricing/types");
@@ -62,4 +66,55 @@ async function analyzeCosts(options) {
62
66
  pricingService.destroy();
63
67
  }
64
68
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLG9DQW1DQztBQWxERCxtREFBZ0Q7QUFDaEQsNkRBQTBEO0FBQzFELDhEQUEyRDtBQUMzRCxtREFBZ0Q7QUFFaEQsMENBQXdCO0FBQ3hCLDJEQUE4RDtBQUFyRCxvSEFBQSxrQkFBa0IsT0FBQTtBQUMzQiwwQ0FBNkU7QUFBcEUsd0dBQUEsZUFBZSxPQUFBO0FBQUUsaUhBQUEsd0JBQXdCLE9BQUE7QUFDbEQsa0RBQWdDO0FBQ2hDLG9EQUFrQztBQUNsQyw0Q0FBMEI7QUFDMUIsK0NBQTZCO0FBQzdCLCtDQUE2QjtBQUM3Qiw4Q0FBNEI7QUFFckIsS0FBSyxVQUFVLFlBQVksQ0FBQyxPQUF1QjtJQUN4RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQztJQUV4QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksK0JBQWMsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQVUsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sY0FBYyxHQUFHLElBQUksK0JBQWMsRUFBRSxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsRUFBRSxDQUFDO0lBRWhDLElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUVqRSxNQUFNLFNBQVMsR0FBRyxNQUFNLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNELE9BQU87WUFDTCxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7WUFDaEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1lBQzVCLGNBQWMsRUFBRSxTQUFTLENBQUMsVUFBVTtZQUNwQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsWUFBWTtZQUN4QyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsYUFBYTtZQUMxQyxPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7WUFBUyxDQUFDO1FBQ1Qsb0RBQW9EO1FBQ3BELGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuYWx5emVPcHRpb25zLCBDb3N0QW5hbHlzaXNSZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERpZmZFbmdpbmUgfSBmcm9tICcuLi9kaWZmL0RpZmZFbmdpbmUnO1xuaW1wb3J0IHsgVGVtcGxhdGVQYXJzZXIgfSBmcm9tICcuLi9wYXJzZXIvVGVtcGxhdGVQYXJzZXInO1xuaW1wb3J0IHsgUHJpY2luZ1NlcnZpY2UgfSBmcm9tICcuLi9wcmljaW5nL1ByaWNpbmdTZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvUmVwb3J0ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IFRlbXBsYXRlUGFyc2VFcnJvciB9IGZyb20gJy4uL3BhcnNlci9UZW1wbGF0ZVBhcnNlcic7XG5leHBvcnQgeyBQcmljaW5nQVBJRXJyb3IsIFVuc3VwcG9ydGVkUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vaW50ZWdyYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4uL3JlcG9ydGVyL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuLi9zeW50aGVzaXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vdGhyZXNob2xkJztcbmV4cG9ydCAqIGZyb20gJy4uL3BpcGVsaW5lJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFuYWx5emVDb3N0cyhvcHRpb25zOiBBbmFseXplT3B0aW9ucyk6IFByb21pc2U8Q29zdEFuYWx5c2lzUmVzdWx0PiB7XG4gIGNvbnN0IHJlZ2lvbiA9IG9wdGlvbnMucmVnaW9uIHx8ICdldS1jZW50cmFsLTEnO1xuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCAndGV4dCc7XG5cbiAgaWYgKCFvcHRpb25zLmJhc2VUZW1wbGF0ZSB8fCAhb3B0aW9ucy50YXJnZXRUZW1wbGF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQm90aCBiYXNlVGVtcGxhdGUgYW5kIHRhcmdldFRlbXBsYXRlIGFyZSByZXF1aXJlZCcpO1xuICB9XG5cbiAgY29uc3QgcGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKCk7XG4gIGNvbnN0IGRpZmZFbmdpbmUgPSBuZXcgRGlmZkVuZ2luZSgpO1xuICBjb25zdCBwcmljaW5nU2VydmljZSA9IG5ldyBQcmljaW5nU2VydmljZSgpO1xuICBjb25zdCByZXBvcnRlciA9IG5ldyBSZXBvcnRlcigpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYmFzZVRlbXBsYXRlT2JqID0gcGFyc2VyLnBhcnNlKG9wdGlvbnMuYmFzZVRlbXBsYXRlKTtcbiAgICBjb25zdCB0YXJnZXRUZW1wbGF0ZU9iaiA9IHBhcnNlci5wYXJzZShvcHRpb25zLnRhcmdldFRlbXBsYXRlKTtcblxuICAgIGNvbnN0IGRpZmYgPSBkaWZmRW5naW5lLmRpZmYoYmFzZVRlbXBsYXRlT2JqLCB0YXJnZXRUZW1wbGF0ZU9iaik7XG5cbiAgICBjb25zdCBjb3N0RGVsdGEgPSBhd2FpdCBwcmljaW5nU2VydmljZS5nZXRDb3N0RGVsdGEoZGlmZiwgcmVnaW9uKTtcblxuICAgIGNvbnN0IHN1bW1hcnkgPSByZXBvcnRlci5nZW5lcmF0ZVJlcG9ydChjb3N0RGVsdGEsIGZvcm1hdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YTogY29zdERlbHRhLnRvdGFsRGVsdGEsXG4gICAgICBjdXJyZW5jeTogY29zdERlbHRhLmN1cnJlbmN5LFxuICAgICAgYWRkZWRSZXNvdXJjZXM6IGNvc3REZWx0YS5hZGRlZENvc3RzLFxuICAgICAgcmVtb3ZlZFJlc291cmNlczogY29zdERlbHRhLnJlbW92ZWRDb3N0cyxcbiAgICAgIG1vZGlmaWVkUmVzb3VyY2VzOiBjb3N0RGVsdGEubW9kaWZpZWRDb3N0cyxcbiAgICAgIHN1bW1hcnksXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCByZXNvdXJjZXMgdG8gcHJldmVudCBoYW5naW5nIGNvbm5lY3Rpb25zXG4gICAgcHJpY2luZ1NlcnZpY2UuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
69
+ /**
70
+ * Analyze a single CloudFormation template for estimated monthly costs
71
+ *
72
+ * @param options - Configuration options including template content, region, format, and analysis config
73
+ * @returns Promise resolving to detailed cost analysis result
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const result = await analyzeSingleTemplate({
78
+ * template: fs.readFileSync('template.json', 'utf-8'),
79
+ * region: 'us-east-1',
80
+ * format: 'text',
81
+ * config: {
82
+ * usageAssumptions: {
83
+ * lambda: { invocationsPerMonth: 1000000 }
84
+ * }
85
+ * }
86
+ * });
87
+ * console.log(result.summary);
88
+ * ```
89
+ */
90
+ async function analyzeSingleTemplate(options) {
91
+ const region = options.region || 'eu-central-1';
92
+ const format = options.format || 'text';
93
+ if (!options.template) {
94
+ throw new Error('Template content is required');
95
+ }
96
+ const analyzer = new SingleTemplateAnalyzer_1.SingleTemplateAnalyzer();
97
+ const reporter = new SingleTemplateReporter_1.SingleTemplateReporter();
98
+ try {
99
+ // Analyze the template
100
+ const result = await analyzer.analyzeCosts(options.template, region, options.config);
101
+ // Generate formatted summary using the reporter
102
+ const summary = reporter.generateReport(result, format);
103
+ return {
104
+ ...result,
105
+ summary,
106
+ };
107
+ }
108
+ catch (error) {
109
+ // Handle AWS credentials errors
110
+ if (error instanceof Error && error.message.includes('Could not load credentials')) {
111
+ throw new Error('AWS credentials not configured. Please set AWS credentials using one of:\n' +
112
+ ' - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\n' +
113
+ ' - AWS_PROFILE environment variable\n' +
114
+ ' - AWS credentials file (~/.aws/credentials)\n' +
115
+ ' - For CI/CD, configure AWS credentials in your pipeline');
116
+ }
117
+ throw error;
118
+ }
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLG9DQW1DQztBQXVCRCxzREFxQ0M7QUFqSEQsbURBQWdEO0FBQ2hELDZEQUEwRDtBQUMxRCw4REFBMkQ7QUFDM0QsbURBQWdEO0FBQ2hELCtFQUE0RTtBQUM1RSwrRUFBNEU7QUFFNUUsMENBQXdCO0FBQ3hCLDBEQUF3QztBQUN4QywyREFBOEQ7QUFBckQsb0hBQUEsa0JBQWtCLE9BQUE7QUFDM0IsMENBQTZFO0FBQXBFLHdHQUFBLGVBQWUsT0FBQTtBQUFFLGlIQUFBLHdCQUF3QixPQUFBO0FBQ2xELGtEQUFnQztBQUNoQyxvREFBa0M7QUFDbEMsNENBQTBCO0FBQzFCLCtDQUE2QjtBQUM3QiwrQ0FBNkI7QUFDN0IsOENBQTRCO0FBRXJCLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBdUI7SUFDeEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUM7SUFFeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUFVLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLEVBQUUsQ0FBQztJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFakUsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixjQUFjLEVBQUUsU0FBUyxDQUFDLFVBQVU7WUFDcEMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLFlBQVk7WUFDeEMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLGFBQWE7WUFDMUMsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO1lBQVMsQ0FBQztRQUNULG9EQUFvRDtRQUNwRCxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLE9BQXFDO0lBRXJDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO0lBRXhDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLCtDQUFzQixFQUFFLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSwrQ0FBc0IsRUFBRSxDQUFDO0lBRTlDLElBQUksQ0FBQztRQUNILHVCQUF1QjtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJGLGdEQUFnRDtRQUNoRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEVBQTRFO2dCQUM1RSx5RUFBeUU7Z0JBQ3pFLHdDQUF3QztnQkFDeEMsaURBQWlEO2dCQUNqRCwyREFBMkQsQ0FDNUQsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5hbHl6ZU9wdGlvbnMsIENvc3RBbmFseXNpc1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQW5hbHl6ZVNpbmdsZVRlbXBsYXRlT3B0aW9ucywgU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0IH0gZnJvbSAnLi9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuaW1wb3J0IHsgRGlmZkVuZ2luZSB9IGZyb20gJy4uL2RpZmYvRGlmZkVuZ2luZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnNlciB9IGZyb20gJy4uL3BhcnNlci9UZW1wbGF0ZVBhcnNlcic7XG5pbXBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4uL3ByaWNpbmcvUHJpY2luZ1NlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0ZXIgfSBmcm9tICcuLi9yZXBvcnRlci9SZXBvcnRlcic7XG5pbXBvcnQgeyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvU2luZ2xlVGVtcGxhdGVSZXBvcnRlcic7XG5pbXBvcnQgeyBTaW5nbGVUZW1wbGF0ZUFuYWx5emVyIH0gZnJvbSAnLi4vYW5hbHlzaXMvU2luZ2xlVGVtcGxhdGVBbmFseXplcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuZXhwb3J0IHsgVGVtcGxhdGVQYXJzZUVycm9yIH0gZnJvbSAnLi4vcGFyc2VyL1RlbXBsYXRlUGFyc2VyJztcbmV4cG9ydCB7IFByaWNpbmdBUElFcnJvciwgVW5zdXBwb3J0ZWRSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vcHJpY2luZy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuLi9pbnRlZ3JhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi4vcmVwb3J0ZXIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4uL3N5bnRoZXNpcyc7XG5leHBvcnQgKiBmcm9tICcuLi90aHJlc2hvbGQnO1xuZXhwb3J0ICogZnJvbSAnLi4vcGlwZWxpbmUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZUNvc3RzKG9wdGlvbnM6IEFuYWx5emVPcHRpb25zKTogUHJvbWlzZTxDb3N0QW5hbHlzaXNSZXN1bHQ+IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMSc7XG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICd0ZXh0JztcblxuICBpZiAoIW9wdGlvbnMuYmFzZVRlbXBsYXRlIHx8ICFvcHRpb25zLnRhcmdldFRlbXBsYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGJhc2VUZW1wbGF0ZSBhbmQgdGFyZ2V0VGVtcGxhdGUgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICBjb25zdCBwYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIoKTtcbiAgY29uc3QgZGlmZkVuZ2luZSA9IG5ldyBEaWZmRW5naW5lKCk7XG4gIGNvbnN0IHByaWNpbmdTZXJ2aWNlID0gbmV3IFByaWNpbmdTZXJ2aWNlKCk7XG4gIGNvbnN0IHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlVGVtcGxhdGVPYmogPSBwYXJzZXIucGFyc2Uob3B0aW9ucy5iYXNlVGVtcGxhdGUpO1xuICAgIGNvbnN0IHRhcmdldFRlbXBsYXRlT2JqID0gcGFyc2VyLnBhcnNlKG9wdGlvbnMudGFyZ2V0VGVtcGxhdGUpO1xuXG4gICAgY29uc3QgZGlmZiA9IGRpZmZFbmdpbmUuZGlmZihiYXNlVGVtcGxhdGVPYmosIHRhcmdldFRlbXBsYXRlT2JqKTtcblxuICAgIGNvbnN0IGNvc3REZWx0YSA9IGF3YWl0IHByaWNpbmdTZXJ2aWNlLmdldENvc3REZWx0YShkaWZmLCByZWdpb24pO1xuXG4gICAgY29uc3Qgc3VtbWFyeSA9IHJlcG9ydGVyLmdlbmVyYXRlUmVwb3J0KGNvc3REZWx0YSwgZm9ybWF0KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbERlbHRhOiBjb3N0RGVsdGEudG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiBjb3N0RGVsdGEuY3VycmVuY3ksXG4gICAgICBhZGRlZFJlc291cmNlczogY29zdERlbHRhLmFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkUmVzb3VyY2VzOiBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLFxuICAgICAgbW9kaWZpZWRSZXNvdXJjZXM6IGNvc3REZWx0YS5tb2RpZmllZENvc3RzLFxuICAgICAgc3VtbWFyeSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIHJlc291cmNlcyB0byBwcmV2ZW50IGhhbmdpbmcgY29ubmVjdGlvbnNcbiAgICBwcmljaW5nU2VydmljZS5kZXN0cm95KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbmFseXplIGEgc2luZ2xlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBlc3RpbWF0ZWQgbW9udGhseSBjb3N0c1xuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgdGVtcGxhdGUgY29udGVudCwgcmVnaW9uLCBmb3JtYXQsIGFuZCBhbmFseXNpcyBjb25maWdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRldGFpbGVkIGNvc3QgYW5hbHlzaXMgcmVzdWx0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplU2luZ2xlVGVtcGxhdGUoe1xuICogICB0ZW1wbGF0ZTogZnMucmVhZEZpbGVTeW5jKCd0ZW1wbGF0ZS5qc29uJywgJ3V0Zi04JyksXG4gKiAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gKiAgIGZvcm1hdDogJ3RleHQnLFxuICogICBjb25maWc6IHtcbiAqICAgICB1c2FnZUFzc3VtcHRpb25zOiB7XG4gKiAgICAgICBsYW1iZGE6IHsgaW52b2NhdGlvbnNQZXJNb250aDogMTAwMDAwMCB9XG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZVNpbmdsZVRlbXBsYXRlKFxuICBvcHRpb25zOiBBbmFseXplU2luZ2xlVGVtcGxhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQ+IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMSc7XG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICd0ZXh0JztcblxuICBpZiAoIW9wdGlvbnMudGVtcGxhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RlbXBsYXRlIGNvbnRlbnQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGFuYWx5emVyID0gbmV3IFNpbmdsZVRlbXBsYXRlQW5hbHl6ZXIoKTtcbiAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgU2luZ2xlVGVtcGxhdGVSZXBvcnRlcigpO1xuXG4gIHRyeSB7XG4gICAgLy8gQW5hbHl6ZSB0aGUgdGVtcGxhdGVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplci5hbmFseXplQ29zdHMob3B0aW9ucy50ZW1wbGF0ZSwgcmVnaW9uLCBvcHRpb25zLmNvbmZpZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmb3JtYXR0ZWQgc3VtbWFyeSB1c2luZyB0aGUgcmVwb3J0ZXJcbiAgICBjb25zdCBzdW1tYXJ5ID0gcmVwb3J0ZXIuZ2VuZXJhdGVSZXBvcnQocmVzdWx0LCBmb3JtYXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHN1bW1hcnksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBIYW5kbGUgQVdTIGNyZWRlbnRpYWxzIGVycm9yc1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0NvdWxkIG5vdCBsb2FkIGNyZWRlbnRpYWxzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0FXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOlxcbicgK1xuICAgICAgICAnICAtIEFXU19BQ0NFU1NfS0VZX0lEIGFuZCBBV1NfU0VDUkVUX0FDQ0VTU19LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVzXFxuJyArXG4gICAgICAgICcgIC0gQVdTX1BST0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGVcXG4nICtcbiAgICAgICAgJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKVxcbicgK1xuICAgICAgICAnICAtIEZvciBDSS9DRCwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiB5b3VyIHBpcGVsaW5lJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbiJdfQ==
@@ -0,0 +1,83 @@
1
+ import { ResourceCost } from '../pricing/types';
2
+ import { UsageAssumptionsConfig, CacheConfig } from '../config/types';
3
+ /**
4
+ * Configuration options for single template analysis
5
+ */
6
+ export interface AnalysisConfig {
7
+ usageAssumptions?: UsageAssumptionsConfig;
8
+ excludedResourceTypes?: string[];
9
+ cacheConfig?: CacheConfig;
10
+ }
11
+ /**
12
+ * Metadata about the analysis
13
+ */
14
+ export interface AnalysisMetadata {
15
+ templateHash: string;
16
+ region: string;
17
+ analyzedAt: Date;
18
+ resourceCount: number;
19
+ supportedResourceCount: number;
20
+ unsupportedResourceCount: number;
21
+ }
22
+ /**
23
+ * Cost information grouped by resource type
24
+ */
25
+ export interface ResourceTypeCost {
26
+ resourceType: string;
27
+ count: number;
28
+ totalCost: number;
29
+ resources: ResourceCost[];
30
+ }
31
+ /**
32
+ * Cost information grouped by confidence level
33
+ */
34
+ export interface ConfidenceLevelCost {
35
+ confidence: 'high' | 'medium' | 'low' | 'unknown';
36
+ count: number;
37
+ totalCost: number;
38
+ }
39
+ /**
40
+ * Detailed cost breakdown for a template
41
+ */
42
+ export interface CostBreakdown {
43
+ byResourceType: ResourceTypeCost[];
44
+ byConfidenceLevel: ConfidenceLevelCost[];
45
+ assumptions: string[];
46
+ }
47
+ /**
48
+ * Enhanced resource cost with additional metadata
49
+ */
50
+ export interface EnhancedResourceCost extends ResourceCost {
51
+ properties?: Record<string, any>;
52
+ region: string;
53
+ calculatedAt: Date;
54
+ }
55
+ /**
56
+ * Result of single template cost analysis
57
+ */
58
+ export interface SingleTemplateCostResult {
59
+ totalMonthlyCost: number;
60
+ currency: string;
61
+ resourceCosts: EnhancedResourceCost[];
62
+ costBreakdown: CostBreakdown;
63
+ summary: string;
64
+ metadata: AnalysisMetadata;
65
+ }
66
+ /**
67
+ * Options for analyzing a single template
68
+ */
69
+ export interface AnalyzeSingleTemplateOptions {
70
+ template: string;
71
+ region?: string;
72
+ format?: 'text' | 'json' | 'markdown';
73
+ config?: AnalysisConfig;
74
+ }
75
+ /**
76
+ * Options for generating single template reports
77
+ */
78
+ export interface SingleTemplateReportOptions {
79
+ showBreakdown?: boolean;
80
+ showAssumptions?: boolean;
81
+ groupByType?: boolean;
82
+ sortBy?: 'cost' | 'name' | 'type';
83
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXRlbXBsYXRlLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zaW5nbGUtdGVtcGxhdGUtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlQ29zdCB9IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcgfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHlzaXNDb25maWcge1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgZXhjbHVkZWRSZXNvdXJjZVR5cGVzPzogc3RyaW5nW107XG4gIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWc7XG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHlzaXNNZXRhZGF0YSB7XG4gIHRlbXBsYXRlSGFzaDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgYW5hbHl6ZWRBdDogRGF0ZTtcbiAgcmVzb3VyY2VDb3VudDogbnVtYmVyO1xuICBzdXBwb3J0ZWRSZXNvdXJjZUNvdW50OiBudW1iZXI7XG4gIHVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvc3QgaW5mb3JtYXRpb24gZ3JvdXBlZCBieSByZXNvdXJjZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VUeXBlQ29zdCB7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbiAgcmVzb3VyY2VzOiBSZXNvdXJjZUNvc3RbXTtcbn1cblxuLyoqXG4gKiBDb3N0IGluZm9ybWF0aW9uIGdyb3VwZWQgYnkgY29uZmlkZW5jZSBsZXZlbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZGVuY2VMZXZlbENvc3Qge1xuICBjb25maWRlbmNlOiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgJ3Vua25vd24nO1xuICBjb3VudDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZXRhaWxlZCBjb3N0IGJyZWFrZG93biBmb3IgYSB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvc3RCcmVha2Rvd24ge1xuICBieVJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlQ29zdFtdO1xuICBieUNvbmZpZGVuY2VMZXZlbDogQ29uZmlkZW5jZUxldmVsQ29zdFtdO1xuICBhc3N1bXB0aW9uczogc3RyaW5nW107XG59XG5cbi8qKlxuICogRW5oYW5jZWQgcmVzb3VyY2UgY29zdCB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFJlc291cmNlQ29zdCBleHRlbmRzIFJlc291cmNlQ29zdCB7XG4gIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICByZWdpb246IHN0cmluZztcbiAgY2FsY3VsYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzaW5nbGUgdGVtcGxhdGUgY29zdCBhbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCB7XG4gIHRvdGFsTW9udGhseUNvc3Q6IG51bWJlcjtcbiAgY3VycmVuY3k6IHN0cmluZztcbiAgcmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXTtcbiAgY29zdEJyZWFrZG93bjogQ29zdEJyZWFrZG93bjtcbiAgc3VtbWFyeTogc3RyaW5nO1xuICBtZXRhZGF0YTogQW5hbHlzaXNNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbmFseXppbmcgYSBzaW5nbGUgdGVtcGxhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplU2luZ2xlVGVtcGxhdGVPcHRpb25zIHtcbiAgdGVtcGxhdGU6IHN0cmluZztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBmb3JtYXQ/OiAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nO1xuICBjb25maWc/OiBBbmFseXNpc0NvbmZpZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBnZW5lcmF0aW5nIHNpbmdsZSB0ZW1wbGF0ZSByZXBvcnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zIHtcbiAgc2hvd0JyZWFrZG93bj86IGJvb2xlYW47XG4gIHNob3dBc3N1bXB0aW9ucz86IGJvb2xlYW47XG4gIGdyb3VwQnlUeXBlPzogYm9vbGVhbjtcbiAgc29ydEJ5PzogJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnO1xufVxuIl19
package/dist/cli/index.js CHANGED
@@ -45,6 +45,48 @@ program
45
45
  .name('cdk-cost-analyzer')
46
46
  .description('Analyze AWS CDK infrastructure changes and provide cost impact summaries')
47
47
  .version('1.0.0');
48
+ // New analyze command for single template analysis
49
+ program
50
+ .command('analyze <template>')
51
+ .description('Analyze a single CloudFormation template for estimated costs')
52
+ .option('--region <region>', 'AWS region for pricing', 'eu-central-1')
53
+ .option('--format <format>', 'Output format: text|json|markdown', 'text')
54
+ .option('--config <path>', 'Path to configuration file')
55
+ .option('--debug', 'Enable verbose debug logging for pricing API calls')
56
+ .action(async (templatePath, options) => {
57
+ try {
58
+ // Enable debug logging if flag is set
59
+ if (options.debug) {
60
+ Logger_1.Logger.setDebugEnabled(true);
61
+ Logger_1.Logger.debug('Debug logging enabled');
62
+ }
63
+ // Check if template file exists
64
+ if (!fs.existsSync(templatePath)) {
65
+ console.error(`Error: Template file not found: ${templatePath}`);
66
+ process.exit(1);
67
+ }
68
+ // Read the template
69
+ const template = fs.readFileSync(templatePath, 'utf-8');
70
+ // Analyze the template
71
+ const result = await (0, api_1.analyzeSingleTemplate)({
72
+ template,
73
+ region: options.region,
74
+ format: options.format,
75
+ });
76
+ // Output the results (summary already contains formatted output)
77
+ console.log(result.summary);
78
+ process.exit(0);
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error) {
82
+ console.error(`Error: ${error.message}`);
83
+ }
84
+ else {
85
+ console.error(`Error: ${String(error)}`);
86
+ }
87
+ process.exit(1);
88
+ }
89
+ });
48
90
  // Original command for direct template comparison
49
91
  program
50
92
  .command('compare')
@@ -224,58 +266,5 @@ program
224
266
  process.exit(1);
225
267
  }
226
268
  });
227
- // Default to compare command for backward compatibility
228
- program
229
- .argument('[base]', 'Path to base CloudFormation template')
230
- .argument('[target]', 'Path to target CloudFormation template')
231
- .option('--region <region>', 'AWS region', 'eu-central-1')
232
- .option('--format <format>', 'Output format: text|json|markdown', 'text')
233
- .option('--config <path>', 'Path to configuration file')
234
- .option('--debug', 'Enable verbose debug logging for pricing API calls')
235
- .action(async (basePath, targetPath, options) => {
236
- if (!basePath || !targetPath) {
237
- program.help();
238
- return;
239
- }
240
- try {
241
- // Enable debug logging if flag is set
242
- if (options?.debug) {
243
- Logger_1.Logger.setDebugEnabled(true);
244
- Logger_1.Logger.debug('Debug logging enabled');
245
- }
246
- if (!fs.existsSync(basePath)) {
247
- console.error(`Error: Base template file not found: ${basePath}`);
248
- process.exit(1);
249
- }
250
- if (!fs.existsSync(targetPath)) {
251
- console.error(`Error: Target template file not found: ${targetPath}`);
252
- process.exit(1);
253
- }
254
- const baseTemplate = fs.readFileSync(basePath, 'utf-8');
255
- const targetTemplate = fs.readFileSync(targetPath, 'utf-8');
256
- const result = await (0, api_1.analyzeCosts)({
257
- baseTemplate,
258
- targetTemplate,
259
- region: options?.region || 'eu-central-1',
260
- format: options?.format || 'text',
261
- });
262
- if (options?.format === 'json') {
263
- console.log(JSON.stringify(result, null, 2));
264
- }
265
- else {
266
- console.log(result.summary);
267
- }
268
- process.exit(0);
269
- }
270
- catch (error) {
271
- if (error instanceof Error) {
272
- console.error(`Error: ${error.message}`);
273
- }
274
- else {
275
- console.error(`Error: ${String(error)}`);
276
- }
277
- process.exit(1);
278
- }
279
- });
280
269
  program.parse();
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6Qix5Q0FBb0M7QUFDcEMsZ0NBQXNDO0FBQ3RDLHlFQUFzRTtBQUN0RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsbUJBQW1CLENBQUM7S0FDekIsV0FBVyxDQUFDLDBFQUEwRSxDQUFDO0tBQ3ZGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQixrREFBa0Q7QUFDbEQsT0FBTztLQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDbEIsV0FBVyxDQUFDLHNDQUFzQyxDQUFDO0tBQ25ELFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUM7S0FDMUQsUUFBUSxDQUFDLFVBQVUsRUFBRSx3Q0FBd0MsQ0FBQztLQUM5RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQztLQUN6RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLE9BQTZFLEVBQUUsRUFBRTtJQUNwSSxJQUFJLENBQUM7UUFDSCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsZUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixlQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7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QUFNLEdBQUcsTUFBTSxJQUFBLGtCQUFZLEVBQUM7WUFDaEMsWUFBWTtZQUNaLGNBQWM7WUFDZCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxjQUFjO1lBQ3pDLE1BQU0sRUFBRyxPQUFPLEVBQUUsTUFBdUMsSUFBSSxNQUFNO1NBQ3BFLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYW5hbHl6ZUNvc3RzIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IFBpcGVsaW5lT3JjaGVzdHJhdG9yIH0gZnJvbSAnLi4vcGlwZWxpbmUvUGlwZWxpbmVPcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbignMS4wLjAnKTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBEZWZhdWx0IHRvIGNvbXBhcmUgY29tbWFuZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxucHJvZ3JhbVxuICAuYXJndW1lbnQoJ1tiYXNlXScsICdQYXRoIHRvIGJhc2UgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAuYXJndW1lbnQoJ1t0YXJnZXRdJywgJ1BhdGggdG8gdGFyZ2V0IENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlJylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jIChiYXNlUGF0aD86IHN0cmluZywgdGFyZ2V0UGF0aD86IHN0cmluZywgb3B0aW9ucz86IHsgcmVnaW9uOiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyBjb25maWc/OiBzdHJpbmc7IGRlYnVnPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgaWYgKCFiYXNlUGF0aCB8fCAhdGFyZ2V0UGF0aCkge1xuICAgICAgcHJvZ3JhbS5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJhc2VQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogQmFzZSB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRhcmdldCB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0YXJnZXRQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhiYXNlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCB0YXJnZXRUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0YXJnZXRQYXRoLCAndXRmLTgnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZUNvc3RzKHtcbiAgICAgICAgYmFzZVRlbXBsYXRlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zPy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMScsXG4gICAgICAgIGZvcm1hdDogKG9wdGlvbnM/LmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nKSB8fCAndGV4dCcsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnN1bW1hcnkpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6Qix5Q0FBb0M7QUFDcEMsZ0NBQTZEO0FBQzdELHlFQUFzRTtBQUN0RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsbUJBQW1CLENBQUM7S0FDekIsV0FBVyxDQUFDLDBFQUEwRSxDQUFDO0tBQ3ZGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQixtREFBbUQ7QUFDbkQsT0FBTztLQUNKLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztLQUM3QixXQUFXLENBQUMsOERBQThELENBQUM7S0FDM0UsTUFBTSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQztLQUNyRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBb0IsRUFBRSxPQUE2RSxFQUFFLEVBQUU7SUFDcEgsSUFBSSxDQUFDO1FBQ0gsc0NBQXNDO1FBQ3RDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLGVBQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsZUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNq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QUFLLENBQUMsVUFBVSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhbmFseXplQ29zdHMsIGFuYWx5emVTaW5nbGVUZW1wbGF0ZSB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgeyBHaXRMYWJJbnRlZ3JhdGlvbiB9IGZyb20gJy4uL2ludGVncmF0aW9ucy9HaXRMYWJJbnRlZ3JhdGlvbic7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzL0xvZ2dlcic7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdjZGstY29zdC1hbmFseXplcicpXG4gIC5kZXNjcmlwdGlvbignQW5hbHl6ZSBBV1MgQ0RLIGluZnJhc3RydWN0dXJlIGNoYW5nZXMgYW5kIHByb3ZpZGUgY29zdCBpbXBhY3Qgc3VtbWFyaWVzJylcbiAgLnZlcnNpb24oJzEuMC4wJyk7XG5cbi8vIE5ldyBhbmFseXplIGNvbW1hbmQgZm9yIHNpbmdsZSB0ZW1wbGF0ZSBhbmFseXNpc1xucHJvZ3JhbVxuICAuY29tbWFuZCgnYW5hbHl6ZSA8dGVtcGxhdGU+JylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIGEgc2luZ2xlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBlc3RpbWF0ZWQgY29zdHMnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIGZvciBwcmljaW5nJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKHRlbXBsYXRlUGF0aDogc3RyaW5nLCBvcHRpb25zOiB7IHJlZ2lvbjogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZzsgY29uZmlnPzogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmFibGUgZGVidWcgbG9nZ2luZyBpZiBmbGFnIGlzIHNldFxuICAgICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgZmlsZSBleGlzdHNcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIC8vIEFuYWx5emUgdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplU2luZ2xlVGVtcGxhdGUoe1xuICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dHB1dCB0aGUgcmVzdWx0cyAoc3VtbWFyeSBhbHJlYWR5IGNvbnRhaW5zIGZvcm1hdHRlZCBvdXRwdXQpXG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQuc3VtbWFyeSk7XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
@@ -6,6 +6,8 @@ export declare class LambdaCalculator implements ResourceCostCalculator {
6
6
  private readonly DEFAULT_INVOCATIONS;
7
7
  private readonly DEFAULT_DURATION_MS;
8
8
  private readonly DEFAULT_MEMORY_MB;
9
+ private readonly FALLBACK_REQUEST_PRICE;
10
+ private readonly FALLBACK_COMPUTE_PRICE;
9
11
  constructor(customInvocationsPerMonth?: number | undefined, customAverageDurationMs?: number | undefined);
10
12
  supports(resourceType: string): boolean;
11
13
  calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
@@ -8,6 +8,10 @@ class LambdaCalculator {
8
8
  DEFAULT_INVOCATIONS = 1000000;
9
9
  DEFAULT_DURATION_MS = 1000;
10
10
  DEFAULT_MEMORY_MB = 128;
11
+ // Fallback pricing rates (AWS Lambda us-east-1 pricing as of 2024)
12
+ // Used when API pricing is unavailable but user provided usage assumptions
13
+ FALLBACK_REQUEST_PRICE = 0.20; // Per 1M requests
14
+ FALLBACK_COMPUTE_PRICE = 0.0000166667; // Per GB-second
11
15
  constructor(customInvocationsPerMonth, customAverageDurationMs) {
12
16
  this.customInvocationsPerMonth = customInvocationsPerMonth;
13
17
  this.customAverageDurationMs = customAverageDurationMs;
@@ -46,6 +50,29 @@ class LambdaCalculator {
46
50
  assumptions.push('Using custom duration assumption from configuration');
47
51
  }
48
52
  if (requestPrice === null || computePrice === null) {
53
+ // If user provided custom usage assumptions, use fallback pricing
54
+ // Otherwise return 0 (pricing not available)
55
+ const hasCustomAssumptions = this.customInvocationsPerMonth !== undefined ||
56
+ this.customAverageDurationMs !== undefined;
57
+ if (hasCustomAssumptions) {
58
+ // Use fallback pricing to provide estimate
59
+ const effectiveRequestPrice = requestPrice ?? this.FALLBACK_REQUEST_PRICE;
60
+ const effectiveComputePrice = computePrice ?? this.FALLBACK_COMPUTE_PRICE;
61
+ const requestCost = (invocations / 1000000) * effectiveRequestPrice;
62
+ const gbSeconds = (memorySize / 1024) * (durationMs / 1000) * invocations;
63
+ const computeCost = gbSeconds * effectiveComputePrice;
64
+ const totalCost = requestCost + computeCost;
65
+ return {
66
+ amount: totalCost,
67
+ currency: 'USD',
68
+ confidence: 'low',
69
+ assumptions: [
70
+ requestPrice === null ? 'Using fallback request pricing (API unavailable)' : '',
71
+ computePrice === null ? 'Using fallback compute pricing (API unavailable)' : '',
72
+ ...assumptions,
73
+ ].filter(a => a !== ''),
74
+ };
75
+ }
49
76
  return {
50
77
  amount: 0,
51
78
  currency: 'USD',
@@ -80,6 +107,26 @@ class LambdaCalculator {
80
107
  if (this.customAverageDurationMs !== undefined) {
81
108
  assumptions.push('Using custom duration assumption from configuration');
82
109
  }
110
+ // If user provided custom usage assumptions, use fallback pricing
111
+ // Otherwise return 0 (pricing API failed)
112
+ const hasCustomAssumptions = this.customInvocationsPerMonth !== undefined ||
113
+ this.customAverageDurationMs !== undefined;
114
+ if (hasCustomAssumptions) {
115
+ // Use fallback pricing to provide estimate even when API fails
116
+ const requestCost = (invocations / 1000000) * this.FALLBACK_REQUEST_PRICE;
117
+ const gbSeconds = (memorySize / 1024) * (durationMs / 1000) * invocations;
118
+ const computeCost = gbSeconds * this.FALLBACK_COMPUTE_PRICE;
119
+ const totalCost = requestCost + computeCost;
120
+ return {
121
+ amount: totalCost,
122
+ currency: 'USD',
123
+ confidence: 'low',
124
+ assumptions: [
125
+ 'Using fallback pricing (API error)',
126
+ ...assumptions.slice(1), // Skip the "Failed to fetch" message, already covered
127
+ ],
128
+ };
129
+ }
83
130
  return {
84
131
  amount: 0,
85
132
  currency: 'USD',
@@ -90,4 +137,4 @@ class LambdaCalculator {
90
137
  }
91
138
  }
92
139
  exports.LambdaCalculator = LambdaCalculator;
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFtYmRhQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQWtEO0FBRWxELE1BQWEsZ0JBQWdCO0lBTVI7SUFDQTtJQU5GLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztJQUM5QixtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDM0IsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBRXpDLFlBQ21CLHlCQUFrQyxFQUNsQyx1QkFBZ0M7UUFEaEMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFTO1FBQ2xDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBUztJQUNoRCxDQUFDO0lBRUosUUFBUSxDQUFDLFlBQW9CO1FBQzNCLE9BQU8sWUFBWSxLQUFLLHVCQUF1QixDQUFDO0lBQ2xELENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUNqQixRQUF3QixFQUN4QixNQUFjLEVBQ2QsYUFBNEI7UUFFNUIsTUFBTSxVQUFVLEdBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN4RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQy9FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFFNUUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUNoRCxXQUFXLEVBQUUsV0FBVztnQkFDeEIsTUFBTSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFO2lCQUNqRDthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDaEQsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLE1BQU0sRUFBRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDO2dCQUMvQixPQUFPLEVBQUU7b0JBQ1AsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRTtpQkFDakQ7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRztnQkFDbEIsV0FBVyxXQUFXLENBQUMsY0FBYyxFQUFFLHdCQUF3QjtnQkFDL0QsV0FBVyxVQUFVLDJCQUEyQjtnQkFDaEQsV0FBVyxVQUFVLHNCQUFzQjthQUM1QyxDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pELFdBQVcsQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUNsRixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQy9DLFdBQVcsQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBRUQsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTztvQkFDTCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxRQUFRLEVBQUUsS0FBSztvQkFDZixVQUFVLEVBQUUsU0FBUztvQkFDckIsV0FBVyxFQUFFO3dCQUNYLG1EQUFtRCxNQUFNLEVBQUU7d0JBQzNELEdBQUcsV0FBVztxQkFDZjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLFlBQVksQ0FBQztZQUUzRCxNQUFNLFNBQVMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDMUUsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLFlBQVksQ0FBQztZQUU3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBRTVDLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFVBQVUsRUFBRSxRQUFRO2dCQUNwQixXQUFXO2FBQ1osQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLDRCQUE0QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BGLGdCQUFnQixXQUFXLENBQUMsY0FBYyxFQUFFLHdCQUF3QjtnQkFDcEUsZ0JBQWdCLFVBQVUsMkJBQTJCO2dCQUNyRCxnQkFBZ0IsVUFBVSxzQkFBc0I7YUFDakQsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqRCxXQUFXLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDbEYsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMvQyxXQUFXLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUVELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQXJHRCw0Q0FxR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciwgTW9udGhseUNvc3QsIFByaWNpbmdDbGllbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVSZWdpb24gfSBmcm9tICcuLi9SZWdpb25NYXBwZXInO1xuXG5leHBvcnQgY2xhc3MgTGFtYmRhQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfSU5WT0NBVElPTlMgPSAxMDAwMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfRFVSQVRJT05fTVMgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTUVNT1JZX01CID0gMTI4O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aD86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyLFxuICApIHt9XG5cbiAgc3VwcG9ydHMocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VUeXBlID09PSAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJztcbiAgfVxuXG4gIGFzeW5jIGNhbGN1bGF0ZUNvc3QoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICBjb25zdCBtZW1vcnlTaXplID0gKHJlc291cmNlLnByb3BlcnRpZXMuTWVtb3J5U2l6ZSBhcyBudW1iZXIpIHx8IHRoaXMuREVGQVVMVF9NRU1PUllfTUI7XG4gICAgY29uc3QgaW52b2NhdGlvbnMgPSB0aGlzLmN1c3RvbUludm9jYXRpb25zUGVyTW9udGggPz8gdGhpcy5ERUZBVUxUX0lOVk9DQVRJT05TO1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zID8/IHRoaXMuREVGQVVMVF9EVVJBVElPTl9NUztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0UHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBV1NMYW1iZGEnLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ2dyb3VwJywgdmFsdWU6ICdBV1MtTGFtYmRhLVJlcXVlc3RzJyB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXB1dGVQcmljZSA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FXU0xhbWJkYScsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnZ3JvdXAnLCB2YWx1ZTogJ0FXUy1MYW1iZGEtRHVyYXRpb24nIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBBc3N1bWVzICR7aW52b2NhdGlvbnMudG9Mb2NhbGVTdHJpbmcoKX0gaW52b2NhdGlvbnMgcGVyIG1vbnRoYCxcbiAgICAgICAgYEFzc3VtZXMgJHtkdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVgLFxuICAgICAgICBgQXNzdW1lcyAke21lbW9yeVNpemV9TUIgbWVtb3J5IGFsbG9jYXRpb25gLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBpbnZvY2F0aW9uIGNvdW50IGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXN0b21BdmVyYWdlRHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBkdXJhdGlvbiBhc3N1bXB0aW9uIGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdFByaWNlID09PSBudWxsIHx8IGNvbXB1dGVQcmljZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICBgUHJpY2luZyBkYXRhIG5vdCBhdmFpbGFibGUgZm9yIExhbWJkYSBpbiByZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gKGludm9jYXRpb25zIC8gMTAwMDAwMCkgKiByZXF1ZXN0UHJpY2U7XG5cbiAgICAgIGNvbnN0IGdiU2Vjb25kcyA9IChtZW1vcnlTaXplIC8gMTAyNCkgKiAoZHVyYXRpb25NcyAvIDEwMDApICogaW52b2NhdGlvbnM7XG4gICAgICBjb25zdCBjb21wdXRlQ29zdCA9IGdiU2Vjb25kcyAqIGNvbXB1dGVQcmljZTtcblxuICAgICAgY29uc3QgdG90YWxDb3N0ID0gcmVxdWVzdENvc3QgKyBjb21wdXRlQ29zdDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbENvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ21lZGl1bScsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgYFdvdWxkIGFzc3VtZSAke2ludm9jYXRpb25zLnRvTG9jYWxlU3RyaW5nKCl9IGludm9jYXRpb25zIHBlciBtb250aGAsXG4gICAgICAgIGBXb3VsZCBhc3N1bWUgJHtkdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVgLFxuICAgICAgICBgV291bGQgYXNzdW1lICR7bWVtb3J5U2l6ZX1NQiBtZW1vcnkgYWxsb2NhdGlvbmAsXG4gICAgICBdO1xuXG4gICAgICBpZiAodGhpcy5jdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGludm9jYXRpb24gY291bnQgYXNzdW1wdGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGR1cmF0aW9uIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFtYmRhQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQWtEO0FBRWxELE1BQWEsZ0JBQWdCO0lBV1I7SUFDQTtJQVhGLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztJQUM5QixtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDM0IsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBRXpDLG1FQUFtRTtJQUNuRSwyRUFBMkU7SUFDMUQsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLENBQUMsa0JBQWtCO0lBQ2pELHNCQUFzQixHQUFHLFlBQVksQ0FBQyxDQUFDLGdCQUFnQjtJQUV4RSxZQUNtQix5QkFBa0MsRUFDbEMsdUJBQWdDO1FBRGhDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBUztRQUNsQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQVM7SUFDaEQsQ0FBQztJQUVKLFFBQVEsQ0FBQyxZQUFvQjtRQUMzQixPQUFPLFlBQVksS0FBSyx1QkFBdUIsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FDakIsUUFBd0IsRUFDeEIsTUFBYyxFQUNkLGFBQTRCO1FBRTVCLE1BQU0sVUFBVSxHQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBcUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDeEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUMvRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBRTVFLElBQUksQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDaEQsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLE1B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QUFJLENBQUMsc0JBQXNCLENBQUM7Z0JBQzFFLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQztnQkFDMUUsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFDNUQsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLFdBQVcsQ0FBQztnQkFFNUMsT0FBTztvQkFDTCxNQUFNLEVBQUUsU0FBUztvQkFDakIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLFdBQVcsRUFBRTt3QkFDWCxvQ0FBb0M7d0JBQ3BDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxzREFBc0Q7cUJBQ2hGO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTztnQkFDTCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsU0FBUztnQkFDckIsV0FBVzthQUNaLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUpELDRDQTRKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiB9IGZyb20gJy4uL1JlZ2lvbk1hcHBlcic7XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFDYWxjdWxhdG9yIGltcGxlbWVudHMgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9JTlZPQ0FUSU9OUyA9IDEwMDAwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9EVVJBVElPTl9NUyA9IDEwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NRU1PUllfTUIgPSAxMjg7XG4gIFxuICAvLyBGYWxsYmFjayBwcmljaW5nIHJhdGVzIChBV1MgTGFtYmRhIHVzLWVhc3QtMSBwcmljaW5nIGFzIG9mIDIwMjQpXG4gIC8vIFVzZWQgd2hlbiBBUEkgcHJpY2luZyBpcyB1bmF2YWlsYWJsZSBidXQgdXNlciBwcm92aWRlZCB1c2FnZSBhc3N1bXB0aW9uc1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX1JFUVVFU1RfUFJJQ0UgPSAwLjIwOyAvLyBQZXIgMU0gcmVxdWVzdHNcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19DT01QVVRFX1BSSUNFID0gMC4wMDAwMTY2NjY3OyAvLyBQZXIgR0Itc2Vjb25kXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQXZlcmFnZUR1cmF0aW9uTXM/OiBudW1iZXIsXG4gICkge31cblxuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nO1xuICB9XG5cbiAgYXN5bmMgY2FsY3VsYXRlQ29zdChcbiAgICByZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IG1lbW9yeVNpemUgPSAocmVzb3VyY2UucHJvcGVydGllcy5NZW1vcnlTaXplIGFzIG51bWJlcikgfHwgdGhpcy5ERUZBVUxUX01FTU9SWV9NQjtcbiAgICBjb25zdCBpbnZvY2F0aW9ucyA9IHRoaXMuY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aCA/PyB0aGlzLkRFRkFVTFRfSU5WT0NBVElPTlM7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHRoaXMuY3VzdG9tQXZlcmFnZUR1cmF0aW9uTXMgPz8gdGhpcy5ERUZBVUxUX0RVUkFUSU9OX01TO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RQcmljZSA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FXU0xhbWJkYScsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnZ3JvdXAnLCB2YWx1ZTogJ0FXUy1MYW1iZGEtUmVxdWVzdHMnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29tcHV0ZVByaWNlID0gYXdhaXQgcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICAgIHNlcnZpY2VDb2RlOiAnQVdTTGFtYmRhJyxcbiAgICAgICAgcmVnaW9uOiBub3JtYWxpemVSZWdpb24ocmVnaW9uKSxcbiAgICAgICAgZmlsdGVyczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdncm91cCcsIHZhbHVlOiAnQVdTLUxhbWJkYS1EdXJhdGlvbicgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhc3N1bXB0aW9ucyA9IFtcbiAgICAgICAgYEFzc3VtZXMgJHtpbnZvY2F0aW9ucy50b0xvY2FsZVN0cmluZygpfSBpbnZvY2F0aW9ucyBwZXIgbW9udGhgLFxuICAgICAgICBgQXNzdW1lcyAke2R1cmF0aW9uTXN9bXMgYXZlcmFnZSBleGVjdXRpb24gdGltZWAsXG4gICAgICAgIGBBc3N1bWVzICR7bWVtb3J5U2l6ZX1NQiBtZW1vcnkgYWxsb2NhdGlvbmAsXG4gICAgICBdO1xuXG4gICAgICBpZiAodGhpcy5jdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGludm9jYXRpb24gY291bnQgYXNzdW1wdGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGR1cmF0aW9uIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1ZXN0UHJpY2UgPT09IG51bGwgfHwgY29tcHV0ZVByaWNlID09PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHVzZXIgcHJvdmlkZWQgY3VzdG9tIHVzYWdlIGFzc3VtcHRpb25zLCB1c2UgZmFsbGJhY2sgcHJpY2luZ1xuICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIDAgKHByaWNpbmcgbm90IGF2YWlsYWJsZSlcbiAgICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmN1c3RvbUludm9jYXRpb25zUGVyTW9udGggIT09IHVuZGVmaW5lZCB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFzQ3VzdG9tQXNzdW1wdGlvbnMpIHtcbiAgICAgICAgICAvLyBVc2UgZmFsbGJhY2sgcHJpY2luZyB0byBwcm92aWRlIGVzdGltYXRlXG4gICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmVxdWVzdFByaWNlID0gcmVxdWVzdFByaWNlID8/IHRoaXMuRkFMTEJBQ0tfUkVRVUVTVF9QUklDRTtcbiAgICAgICAgICBjb25zdCBlZmZlY3RpdmVDb21wdXRlUHJpY2UgPSBjb21wdXRlUHJpY2UgPz8gdGhpcy5GQUxMQkFDS19DT01QVVRFX1BSSUNFO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gKGludm9jYXRpb25zIC8gMTAwMDAwMCkgKiBlZmZlY3RpdmVSZXF1ZXN0UHJpY2U7XG4gICAgICAgICAgY29uc3QgZ2JTZWNvbmRzID0gKG1lbW9yeVNpemUgLyAxMDI0KSAqIChkdXJhdGlvbk1zIC8gMTAwMCkgKiBpbnZvY2F0aW9ucztcbiAgICAgICAgICBjb25zdCBjb21wdXRlQ29zdCA9IGdiU2Vjb25kcyAqIGVmZmVjdGl2ZUNvbXB1dGVQcmljZTtcbiAgICAgICAgICBjb25zdCB0b3RhbENvc3QgPSByZXF1ZXN0Q29zdCArIGNvbXB1dGVDb3N0O1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbW91bnQ6IHRvdGFsQ29zdCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICAgIGNvbmZpZGVuY2U6ICdsb3cnLFxuICAgICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgICAgcmVxdWVzdFByaWNlID09PSBudWxsID8gJ1VzaW5nIGZhbGxiYWNrIHJlcXVlc3QgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScgOiAnJyxcbiAgICAgICAgICAgICAgY29tcHV0ZVByaWNlID09PSBudWxsID8gJ1VzaW5nIGZhbGxiYWNrIGNvbXB1dGUgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScgOiAnJyxcbiAgICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMsXG4gICAgICAgICAgICBdLmZpbHRlcihhID0+IGEgIT09ICcnKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICBgUHJpY2luZyBkYXRhIG5vdCBhdmFpbGFibGUgZm9yIExhbWJkYSBpbiByZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gKGludm9jYXRpb25zIC8gMTAwMDAwMCkgKiByZXF1ZXN0UHJpY2U7XG5cbiAgICAgIGNvbnN0IGdiU2Vjb25kcyA9IChtZW1vcnlTaXplIC8gMTAyNCkgKiAoZHVyYXRpb25NcyAvIDEwMDApICogaW52b2NhdGlvbnM7XG4gICAgICBjb25zdCBjb21wdXRlQ29zdCA9IGdiU2Vjb25kcyAqIGNvbXB1dGVQcmljZTtcblxuICAgICAgY29uc3QgdG90YWxDb3N0ID0gcmVxdWVzdENvc3QgKyBjb21wdXRlQ29zdDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbENvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ21lZGl1bScsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgYFdvdWxkIGFzc3VtZSAke2ludm9jYXRpb25zLnRvTG9jYWxlU3RyaW5nKCl9IGludm9jYXRpb25zIHBlciBtb250aGAsXG4gICAgICAgIGBXb3VsZCBhc3N1bWUgJHtkdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVgLFxuICAgICAgICBgV291bGQgYXNzdW1lICR7bWVtb3J5U2l6ZX1NQiBtZW1vcnkgYWxsb2NhdGlvbmAsXG4gICAgICBdO1xuXG4gICAgICBpZiAodGhpcy5jdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGludm9jYXRpb24gY291bnQgYXNzdW1wdGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGR1cmF0aW9uIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzZXIgcHJvdmlkZWQgY3VzdG9tIHVzYWdlIGFzc3VtcHRpb25zLCB1c2UgZmFsbGJhY2sgcHJpY2luZ1xuICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiAwIChwcmljaW5nIEFQSSBmYWlsZWQpXG4gICAgICBjb25zdCBoYXNDdXN0b21Bc3N1bXB0aW9ucyA9IHRoaXMuY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aCAhPT0gdW5kZWZpbmVkIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIGlmIChoYXNDdXN0b21Bc3N1bXB0aW9ucykge1xuICAgICAgICAvLyBVc2UgZmFsbGJhY2sgcHJpY2luZyB0byBwcm92aWRlIGVzdGltYXRlIGV2ZW4gd2hlbiBBUEkgZmFpbHNcbiAgICAgICAgY29uc3QgcmVxdWVzdENvc3QgPSAoaW52b2NhdGlvbnMgLyAxMDAwMDAwKSAqIHRoaXMuRkFMTEJBQ0tfUkVRVUVTVF9QUklDRTtcbiAgICAgICAgY29uc3QgZ2JTZWNvbmRzID0gKG1lbW9yeVNpemUgLyAxMDI0KSAqIChkdXJhdGlvbk1zIC8gMTAwMCkgKiBpbnZvY2F0aW9ucztcbiAgICAgICAgY29uc3QgY29tcHV0ZUNvc3QgPSBnYlNlY29uZHMgKiB0aGlzLkZBTExCQUNLX0NPTVBVVEVfUFJJQ0U7XG4gICAgICAgIGNvbnN0IHRvdGFsQ29zdCA9IHJlcXVlc3RDb3N0ICsgY29tcHV0ZUNvc3Q7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogdG90YWxDb3N0LFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAnbG93JyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgJ1VzaW5nIGZhbGxiYWNrIHByaWNpbmcgKEFQSSBlcnJvciknLFxuICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMuc2xpY2UoMSksIC8vIFNraXAgdGhlIFwiRmFpbGVkIHRvIGZldGNoXCIgbWVzc2FnZSwgYWxyZWFkeSBjb3ZlcmVkXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- v0.1.10
1
+ v0.1.11
@@ -0,0 +1,31 @@
1
+ import { SingleTemplateCostResult, SingleTemplateReportOptions } from '../api/single-template-types';
2
+ /**
3
+ * Reporter for generating formatted output for single template cost analysis
4
+ */
5
+ export declare class SingleTemplateReporter {
6
+ /**
7
+ * Generate a formatted report from single template analysis result
8
+ *
9
+ * @param result - The analysis result
10
+ * @param format - Output format (text, json, or markdown)
11
+ * @param options - Optional formatting preferences
12
+ * @returns Formatted report string
13
+ */
14
+ generateReport(result: SingleTemplateCostResult, format: 'text' | 'json' | 'markdown', options?: SingleTemplateReportOptions): string;
15
+ /**
16
+ * Generate JSON format report
17
+ */
18
+ private generateJsonReport;
19
+ /**
20
+ * Generate text format report
21
+ */
22
+ private generateTextReport;
23
+ /**
24
+ * Generate markdown format report
25
+ */
26
+ private generateMarkdownReport;
27
+ /**
28
+ * Sort resources based on specified criteria
29
+ */
30
+ private sortResources;
31
+ }