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