@aws-cdk/cloudformation-diff 0.0.0
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/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +12 -0
- package/lib/diff/index.d.ts +9 -0
- package/lib/diff/index.js +92 -0
- package/lib/diff/maybe-parsed.d.ts +14 -0
- package/lib/diff/maybe-parsed.js +14 -0
- package/lib/diff/template-and-changeset-diff-merger.d.ts +33 -0
- package/lib/diff/template-and-changeset-diff-merger.js +128 -0
- package/lib/diff/types.d.ts +368 -0
- package/lib/diff/types.js +498 -0
- package/lib/diff/util.d.ts +57 -0
- package/lib/diff/util.js +199 -0
- package/lib/diff-template.d.ts +25 -0
- package/lib/diff-template.js +212 -0
- package/lib/diffable.d.ts +22 -0
- package/lib/diffable.js +47 -0
- package/lib/format-table.d.ts +6 -0
- package/lib/format-table.js +108 -0
- package/lib/format.d.ts +106 -0
- package/lib/format.js +436 -0
- package/lib/iam/iam-changes.d.ts +66 -0
- package/lib/iam/iam-changes.js +421 -0
- package/lib/iam/iam-identity-center.d.ts +78 -0
- package/lib/iam/iam-identity-center.js +46 -0
- package/lib/iam/managed-policy.d.ts +11 -0
- package/lib/iam/managed-policy.js +33 -0
- package/lib/iam/statement.d.ts +113 -0
- package/lib/iam/statement.js +270 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +24 -0
- package/lib/network/security-group-changes.d.ts +32 -0
- package/lib/network/security-group-changes.js +99 -0
- package/lib/network/security-group-rule.d.ts +50 -0
- package/lib/network/security-group-rule.js +97 -0
- package/lib/render-intrinsics.d.ts +21 -0
- package/lib/render-intrinsics.js +78 -0
- package/lib/util.d.ts +7 -0
- package/lib/util.js +62 -0
- package/package.json +80 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single security group rule, either egress or ingress
|
|
3
|
+
*/
|
|
4
|
+
export declare class SecurityGroupRule {
|
|
5
|
+
/**
|
|
6
|
+
* Group ID of the group this rule applies to
|
|
7
|
+
*/
|
|
8
|
+
readonly groupId: string;
|
|
9
|
+
/**
|
|
10
|
+
* IP protocol this rule applies to
|
|
11
|
+
*/
|
|
12
|
+
readonly ipProtocol: string;
|
|
13
|
+
/**
|
|
14
|
+
* Start of port range this rule applies to, or ICMP type
|
|
15
|
+
*/
|
|
16
|
+
readonly fromPort?: number;
|
|
17
|
+
/**
|
|
18
|
+
* End of port range this rule applies to, or ICMP code
|
|
19
|
+
*/
|
|
20
|
+
readonly toPort?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Peer of this rule
|
|
23
|
+
*/
|
|
24
|
+
readonly peer?: RulePeer;
|
|
25
|
+
constructor(ruleObject: any, groupRef?: string);
|
|
26
|
+
equal(other: SecurityGroupRule): boolean;
|
|
27
|
+
describeProtocol(): string;
|
|
28
|
+
describePeer(): string;
|
|
29
|
+
toJson(): RuleJson;
|
|
30
|
+
}
|
|
31
|
+
export interface CidrIpPeer {
|
|
32
|
+
kind: 'cidr-ip';
|
|
33
|
+
ip: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SecurityGroupPeer {
|
|
36
|
+
kind: 'security-group';
|
|
37
|
+
securityGroupId: string;
|
|
38
|
+
}
|
|
39
|
+
export interface PrefixListPeer {
|
|
40
|
+
kind: 'prefix-list';
|
|
41
|
+
prefixListId: string;
|
|
42
|
+
}
|
|
43
|
+
export type RulePeer = CidrIpPeer | SecurityGroupPeer | PrefixListPeer;
|
|
44
|
+
export interface RuleJson {
|
|
45
|
+
groupId: string;
|
|
46
|
+
ipProtocol: string;
|
|
47
|
+
fromPort?: number;
|
|
48
|
+
toPort?: number;
|
|
49
|
+
peer?: RulePeer;
|
|
50
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecurityGroupRule = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A single security group rule, either egress or ingress
|
|
6
|
+
*/
|
|
7
|
+
class SecurityGroupRule {
|
|
8
|
+
constructor(ruleObject, groupRef) {
|
|
9
|
+
var _a;
|
|
10
|
+
this.ipProtocol = ((_a = ruleObject.IpProtocol) === null || _a === void 0 ? void 0 : _a.toString()) || '*unknown*';
|
|
11
|
+
this.fromPort = ruleObject.FromPort;
|
|
12
|
+
this.toPort = ruleObject.ToPort;
|
|
13
|
+
this.groupId = ruleObject.GroupId || groupRef || '*unknown*'; // In case of an inline rule
|
|
14
|
+
this.peer =
|
|
15
|
+
findFirst(ruleObject, ['CidrIp', 'CidrIpv6'], (ip) => ({ kind: 'cidr-ip', ip }))
|
|
16
|
+
||
|
|
17
|
+
findFirst(ruleObject, ['DestinationSecurityGroupId', 'SourceSecurityGroupId'], (securityGroupId) => ({ kind: 'security-group', securityGroupId }))
|
|
18
|
+
||
|
|
19
|
+
findFirst(ruleObject, ['DestinationPrefixListId', 'SourcePrefixListId'], (prefixListId) => ({ kind: 'prefix-list', prefixListId }));
|
|
20
|
+
}
|
|
21
|
+
equal(other) {
|
|
22
|
+
return this.ipProtocol === other.ipProtocol
|
|
23
|
+
&& this.fromPort === other.fromPort
|
|
24
|
+
&& this.toPort === other.toPort
|
|
25
|
+
&& peerEqual(this.peer, other.peer);
|
|
26
|
+
}
|
|
27
|
+
describeProtocol() {
|
|
28
|
+
if (this.ipProtocol === '-1') {
|
|
29
|
+
return 'Everything';
|
|
30
|
+
}
|
|
31
|
+
const ipProtocol = this.ipProtocol.toUpperCase();
|
|
32
|
+
if (this.fromPort === -1) {
|
|
33
|
+
return `All ${ipProtocol}`;
|
|
34
|
+
}
|
|
35
|
+
if (this.fromPort === this.toPort) {
|
|
36
|
+
return `${ipProtocol} ${this.fromPort}`;
|
|
37
|
+
}
|
|
38
|
+
return `${ipProtocol} ${this.fromPort}-${this.toPort}`;
|
|
39
|
+
}
|
|
40
|
+
describePeer() {
|
|
41
|
+
if (this.peer) {
|
|
42
|
+
switch (this.peer.kind) {
|
|
43
|
+
case 'cidr-ip':
|
|
44
|
+
if (this.peer.ip === '0.0.0.0/0') {
|
|
45
|
+
return 'Everyone (IPv4)';
|
|
46
|
+
}
|
|
47
|
+
if (this.peer.ip === '::/0') {
|
|
48
|
+
return 'Everyone (IPv6)';
|
|
49
|
+
}
|
|
50
|
+
return `${this.peer.ip}`;
|
|
51
|
+
case 'prefix-list': return `${this.peer.prefixListId}`;
|
|
52
|
+
case 'security-group': return `${this.peer.securityGroupId}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return '?';
|
|
56
|
+
}
|
|
57
|
+
toJson() {
|
|
58
|
+
return {
|
|
59
|
+
groupId: this.groupId,
|
|
60
|
+
ipProtocol: this.ipProtocol,
|
|
61
|
+
fromPort: this.fromPort,
|
|
62
|
+
toPort: this.toPort,
|
|
63
|
+
peer: this.peer,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.SecurityGroupRule = SecurityGroupRule;
|
|
68
|
+
function peerEqual(a, b) {
|
|
69
|
+
if ((a === undefined) !== (b === undefined)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (a === undefined) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (a.kind !== b.kind) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
switch (a.kind) {
|
|
79
|
+
case 'cidr-ip': return a.ip === b.ip;
|
|
80
|
+
case 'security-group': return a.securityGroupId === b.securityGroupId;
|
|
81
|
+
case 'prefix-list': return a.prefixListId === b.prefixListId;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function findFirst(obj, keys, fn) {
|
|
85
|
+
for (const key of keys) {
|
|
86
|
+
try {
|
|
87
|
+
if (key in obj) {
|
|
88
|
+
return fn(obj[key]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
debugger;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5LWdyb3VwLXJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQTBCNUIsWUFBWSxVQUFlLEVBQUUsUUFBaUI7O1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQSxNQUFBLFVBQVUsQ0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRSxLQUFJLFdBQVcsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsNEJBQTRCO1FBRTFGLElBQUksQ0FBQyxJQUFJO1lBQ0wsU0FBUyxDQUFDLFVBQVUsRUFDbEIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQ3RCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQWlCLENBQUEsQ0FBQzs7b0JBRWxELFNBQVMsQ0FBQyxVQUFVLEVBQ2xCLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUMsRUFDdkQsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUF3QixDQUFBLENBQUM7O29CQUUxRixTQUFTLENBQUMsVUFBVSxFQUNsQixDQUFDLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLEVBQ2pELENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQXFCLENBQUEsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTSxLQUFLLENBQUMs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LGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFNLENBQWMsQ0FBQyxlQUFlLENBQUM7UUFDcEYsS0FBSyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEtBQU0sQ0FBYyxDQUFDLFlBQVksQ0FBQztJQUM3RSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFJLEdBQVEsRUFBRSxJQUFjLEVBQUUsRUFBb0I7SUFDbEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDZixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxRQUFRLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2luZ2xlIHNlY3VyaXR5IGdyb3VwIHJ1bGUsIGVpdGhlciBlZ3Jlc3Mgb3IgaW5ncmVzc1xuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlHcm91cFJ1bGUge1xuICAvKipcbiAgICogR3JvdXAgSUQgb2YgdGhlIGdyb3VwIHRoaXMgcnVsZSBhcHBsaWVzIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUCBwcm90b2NvbCB0aGlzIHJ1bGUgYXBwbGllcyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwUHJvdG9jb2w6IHN0cmluZztcblxuICAvKipcbiAgICogU3RhcnQgb2YgcG9ydCByYW5nZSB0aGlzIHJ1bGUgYXBwbGllcyB0bywgb3IgSUNNUCB0eXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnJvbVBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVuZCBvZiBwb3J0IHJhbmdlIHRoaXMgcnVsZSBhcHBsaWVzIHRvLCBvciBJQ01QIGNvZGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b1BvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlZXIgb2YgdGhpcyBydWxlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGVlcj86IFJ1bGVQZWVyO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bGVPYmplY3Q6IGFueSwgZ3JvdXBSZWY/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlwUHJvdG9jb2wgPSBydWxlT2JqZWN0LklwUHJvdG9jb2w/LnRvU3RyaW5nKCkgfHwgJyp1bmtub3duKic7XG4gICAgdGhpcy5mcm9tUG9ydCA9IHJ1bGVPYmplY3QuRnJvbVBvcnQ7XG4gICAgdGhpcy50b1BvcnQgPSBydWxlT2JqZWN0LlRvUG9ydDtcbiAgICB0aGlzLmdyb3VwSWQgPSBydWxlT2JqZWN0Lkdyb3VwSWQgfHwgZ3JvdXBSZWYgfHwgJyp1bmtub3duKic7IC8vIEluIGNhc2Ugb2YgYW4gaW5saW5lIHJ1bGVcblxuICAgIHRoaXMucGVlciA9XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnQ2lkcklwJywgJ0NpZHJJcHY2J10sXG4gICAgICAgICAgKGlwKSA9PiAoeyBraW5kOiAnY2lkci1pcCcsIGlwIH0gYXMgQ2lkcklwUGVlcikpXG4gICAgICAgIHx8XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnRGVzdGluYXRpb25TZWN1cml0eUdyb3VwSWQnLCAnU291cmNlU2VjdXJpdHlHcm91cElkJ10sXG4gICAgICAgICAgKHNlY3VyaXR5R3JvdXBJZCkgPT4gKHsga2luZDogJ3NlY3VyaXR5LWdyb3VwJywgc2VjdXJpdHlHcm91cElkIH0gYXMgU2VjdXJpdHlHcm91cFBlZXIpKVxuICAgICAgICB8fFxuICAgICAgICBmaW5kRmlyc3QocnVsZU9iamVjdCxcbiAgICAgICAgICBbJ0Rlc3RpbmF0aW9uUHJlZml4TGlzdElkJywgJ1NvdXJjZVByZWZpeExpc3RJZCddLFxuICAgICAgICAgIChwcmVmaXhMaXN0SWQpID0+ICh7IGtpbmQ6ICdwcmVmaXgtbGlzdCcsIHByZWZpeExpc3RJZCB9IGFzIFByZWZpeExpc3RQZWVyKSk7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IFNlY3VyaXR5R3JvdXBSdWxlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXBQcm90b2NvbCA9PT0gb3RoZXIuaXBQcm90b2NvbFxuICAgICAgICAmJiB0aGlzLmZyb21Qb3J0ID09PSBvdGhlci5mcm9tUG9ydFxuICAgICAgICAmJiB0aGlzLnRvUG9ydCA9PT0gb3RoZXIudG9Qb3J0XG4gICAgICAgICYmIHBlZXJFcXVhbCh0aGlzLnBlZXIsIG90aGVyLnBlZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc2NyaWJlUHJvdG9jb2woKSB7XG4gICAgaWYgKHRoaXMuaXBQcm90b2NvbCA9PT0gJy0xJykgeyByZXR1cm4gJ0V2ZXJ5dGhpbmcnOyB9XG5cbiAgICBjb25zdCBpcFByb3RvY29sID0gdGhpcy5pcFByb3RvY29sLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAodGhpcy5mcm9tUG9ydCA9PT0gLTEpIHsgcmV0dXJuIGBBbGwgJHtpcFByb3RvY29sfWA7IH1cbiAgICBpZiAodGhpcy5mcm9tUG9ydCA9PT0gdGhpcy50b1BvcnQpIHsgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH1gOyB9XG4gICAgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH0tJHt0aGlzLnRvUG9ydH1gO1xuICB9XG5cbiAgcHVibGljIGRlc2NyaWJlUGVlcigpIHtcbiAgICBpZiAodGhpcy5wZWVyKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMucGVlci5raW5kKSB7XG4gICAgICAgIGNhc2UgJ2NpZHItaXAnOlxuICAgICAgICAgIGlmICh0aGlzLnBlZXIuaXAgPT09ICcwLjAuMC4wLzAnKSB7IHJldHVybiAnRXZlcnlvbmUgKElQdjQpJzsgfVxuICAgICAgICAgIGlmICh0aGlzLnBlZXIuaXAgPT09ICc6Oi8wJykgeyByZXR1cm4gJ0V2ZXJ5b25lIChJUHY2KSc7IH1cbiAgICAgICAgICByZXR1cm4gYCR7dGhpcy5wZWVyLmlwfWA7XG4gICAgICAgIGNhc2UgJ3ByZWZpeC1saXN0JzogcmV0dXJuIGAke3RoaXMucGVlci5wcmVmaXhMaXN0SWR9YDtcbiAgICAgICAgY2FzZSAnc2VjdXJpdHktZ3JvdXAnOiByZXR1cm4gYCR7dGhpcy5wZWVyLnNlY3VyaXR5R3JvdXBJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnPyc7XG4gIH1cblxuICBwdWJsaWMgdG9Kc29uKCk6IFJ1bGVKc29uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLFxuICAgICAgaXBQcm90b2NvbDogdGhpcy5pcFByb3RvY29sLFxuICAgICAgZnJvbVBvcnQ6IHRoaXMuZnJvbVBvcnQsXG4gICAgICB0b1BvcnQ6IHRoaXMudG9Qb3J0LFxuICAgICAgcGVlcjogdGhpcy5wZWVyLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaWRySXBQZWVyIHtcbiAga2luZDogJ2NpZHItaXAnO1xuICBpcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBQZWVyIHtcbiAga2luZDogJ3NlY3VyaXR5LWdyb3VwJztcbiAgc2VjdXJpdHlHcm91cElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZml4TGlzdFBlZXIge1xuICBraW5kOiAncHJlZml4LWxpc3QnO1xuICBwcmVmaXhMaXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUnVsZVBlZXIgPSBDaWRySXBQZWVyIHwgU2VjdXJpdHlHcm91cFBlZXIgfCBQcmVmaXhMaXN0UGVlcjtcblxuZnVuY3Rpb24gcGVlckVxdWFsKGE/OiBSdWxlUGVlciwgYj86IFJ1bGVQZWVyKSB7XG4gIGlmICgoYSA9PT0gdW5kZWZpbmVkKSAhPT0gKGIgPT09IHVuZGVmaW5lZCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHRydWU7IH1cblxuICBpZiAoYS5raW5kICE9PSBiIS5raW5kKSB7IHJldHVybiBmYWxzZTsgfVxuICBzd2l0Y2ggKGEua2luZCkge1xuICAgIGNhc2UgJ2NpZHItaXAnOiByZXR1cm4gYS5pcCA9PT0gKGIgYXMgdHlwZW9mIGEpLmlwO1xuICAgIGNhc2UgJ3NlY3VyaXR5LWdyb3VwJzogcmV0dXJuIGEuc2VjdXJpdHlHcm91cElkID09PSAoYiBhcyB0eXBlb2YgYSkuc2VjdXJpdHlHcm91cElkO1xuICAgIGNhc2UgJ3ByZWZpeC1saXN0JzogcmV0dXJuIGEucHJlZml4TGlzdElkID09PSAoYiBhcyB0eXBlb2YgYSkucHJlZml4TGlzdElkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRGaXJzdDxUPihvYmo6IGFueSwga2V5czogc3RyaW5nW10sIGZuOiAoeDogc3RyaW5nKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIGZuKG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlSnNvbiB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgaXBQcm90b2NvbDogc3RyaW5nO1xuICBmcm9tUG9ydD86IG51bWJlcjtcbiAgdG9Qb3J0PzogbnVtYmVyO1xuICBwZWVyPzogUnVsZVBlZXI7XG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn CloudFormation intrinsics into strings
|
|
3
|
+
*
|
|
4
|
+
* ------
|
|
5
|
+
*
|
|
6
|
+
* This stringification is not intended to be mechanically reversible! It's intended
|
|
7
|
+
* to be understood by humans!
|
|
8
|
+
*
|
|
9
|
+
* ------
|
|
10
|
+
*
|
|
11
|
+
* Turns Fn::GetAtt and Fn::Ref objects into the same strings that can be
|
|
12
|
+
* parsed by Fn::Sub, but without the surrounding intrinsics.
|
|
13
|
+
*
|
|
14
|
+
* Evaluates Fn::Join directly if the second argument is a literal list of strings.
|
|
15
|
+
*
|
|
16
|
+
* Removes list and object values evaluating to { Ref: 'AWS::NoValue' }.
|
|
17
|
+
*
|
|
18
|
+
* For other intrinsics we choose a string representation that CloudFormation
|
|
19
|
+
* cannot actually parse, but is comprehensible to humans.
|
|
20
|
+
*/
|
|
21
|
+
export declare function renderIntrinsics(x: any): any;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderIntrinsics = renderIntrinsics;
|
|
4
|
+
/**
|
|
5
|
+
* Turn CloudFormation intrinsics into strings
|
|
6
|
+
*
|
|
7
|
+
* ------
|
|
8
|
+
*
|
|
9
|
+
* This stringification is not intended to be mechanically reversible! It's intended
|
|
10
|
+
* to be understood by humans!
|
|
11
|
+
*
|
|
12
|
+
* ------
|
|
13
|
+
*
|
|
14
|
+
* Turns Fn::GetAtt and Fn::Ref objects into the same strings that can be
|
|
15
|
+
* parsed by Fn::Sub, but without the surrounding intrinsics.
|
|
16
|
+
*
|
|
17
|
+
* Evaluates Fn::Join directly if the second argument is a literal list of strings.
|
|
18
|
+
*
|
|
19
|
+
* Removes list and object values evaluating to { Ref: 'AWS::NoValue' }.
|
|
20
|
+
*
|
|
21
|
+
* For other intrinsics we choose a string representation that CloudFormation
|
|
22
|
+
* cannot actually parse, but is comprehensible to humans.
|
|
23
|
+
*/
|
|
24
|
+
function renderIntrinsics(x) {
|
|
25
|
+
if (Array.isArray(x)) {
|
|
26
|
+
return x.filter(el => !isNoValue(el)).map(renderIntrinsics);
|
|
27
|
+
}
|
|
28
|
+
if (isNoValue(x)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const intrinsic = getIntrinsic(x);
|
|
32
|
+
if (intrinsic) {
|
|
33
|
+
if (intrinsic.fn === 'Ref') {
|
|
34
|
+
return '${' + intrinsic.args + '}';
|
|
35
|
+
}
|
|
36
|
+
if (intrinsic.fn === 'Fn::GetAtt') {
|
|
37
|
+
return '${' + intrinsic.args[0] + '.' + intrinsic.args[1] + '}';
|
|
38
|
+
}
|
|
39
|
+
if (intrinsic.fn === 'Fn::Join') {
|
|
40
|
+
return unCloudFormationFnJoin(intrinsic.args[0], intrinsic.args[1]);
|
|
41
|
+
}
|
|
42
|
+
return stringifyIntrinsic(intrinsic.fn, intrinsic.args);
|
|
43
|
+
}
|
|
44
|
+
if (typeof x === 'object' && x !== null) {
|
|
45
|
+
const ret = {};
|
|
46
|
+
for (const [key, value] of Object.entries(x)) {
|
|
47
|
+
if (!isNoValue(value)) {
|
|
48
|
+
ret[key] = renderIntrinsics(value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return ret;
|
|
52
|
+
}
|
|
53
|
+
return x;
|
|
54
|
+
}
|
|
55
|
+
function unCloudFormationFnJoin(separator, args) {
|
|
56
|
+
if (Array.isArray(args)) {
|
|
57
|
+
return args.filter(el => !isNoValue(el)).map(renderIntrinsics).join(separator);
|
|
58
|
+
}
|
|
59
|
+
return stringifyIntrinsic('Fn::Join', [separator, args]);
|
|
60
|
+
}
|
|
61
|
+
function stringifyIntrinsic(fn, args) {
|
|
62
|
+
return JSON.stringify({ [fn]: renderIntrinsics(args) });
|
|
63
|
+
}
|
|
64
|
+
function getIntrinsic(x) {
|
|
65
|
+
if (x === undefined || x === null || Array.isArray(x)) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
if (typeof x !== 'object') {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const keys = Object.keys(x);
|
|
72
|
+
return keys.length === 1 && (keys[0] === 'Ref' || keys[0].startsWith('Fn::')) ? { fn: keys[0], args: x[keys[0]] } : undefined;
|
|
73
|
+
}
|
|
74
|
+
function isNoValue(x) {
|
|
75
|
+
const int = getIntrinsic(x);
|
|
76
|
+
return int && int.fn === 'Ref' && int.args === 'AWS::NoValue';
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWludHJpbnNpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZW5kZXItaW50cmluc2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9CQSw0Q0F5QkM7QUE3Q0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxDQUFNO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFFdkMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFBQyxPQUFPLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUFDLENBQUM7UUFDbkUsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQUMsT0FBTyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFBQyxDQUFDO1FBQ3ZHLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUFDLE9BQU8sc0JBQXNCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ3pHLE9BQU8sa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxJQUFTO0lBQzFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEVBQVUsRUFBRSxJQUFTO0lBQy9DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxDQUFNO0lBQzFCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEksQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLENBQU07SUFDdkIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDO0FBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gQ2xvdWRGb3JtYXRpb24gaW50cmluc2ljcyBpbnRvIHN0cmluZ3NcbiAqXG4gKiAtLS0tLS1cbiAqXG4gKiBUaGlzIHN0cmluZ2lmaWNhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgbWVjaGFuaWNhbGx5IHJldmVyc2libGUhIEl0J3MgaW50ZW5kZWRcbiAqIHRvIGJlIHVuZGVyc3Rvb2QgYnkgaHVtYW5zIVxuICpcbiAqIC0tLS0tLVxuICpcbiAqIFR1cm5zIEZuOjpHZXRBdHQgYW5kIEZuOjpSZWYgb2JqZWN0cyBpbnRvIHRoZSBzYW1lIHN0cmluZ3MgdGhhdCBjYW4gYmVcbiAqIHBhcnNlZCBieSBGbjo6U3ViLCBidXQgd2l0aG91dCB0aGUgc3Vycm91bmRpbmcgaW50cmluc2ljcy5cbiAqXG4gKiBFdmFsdWF0ZXMgRm46OkpvaW4gZGlyZWN0bHkgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIGxpdGVyYWwgbGlzdCBvZiBzdHJpbmdzLlxuICpcbiAqIFJlbW92ZXMgbGlzdCBhbmQgb2JqZWN0IHZhbHVlcyBldmFsdWF0aW5nIHRvIHsgUmVmOiAnQVdTOjpOb1ZhbHVlJyB9LlxuICpcbiAqIEZvciBvdGhlciBpbnRyaW5zaWNzIHdlIGNob29zZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB0aGF0IENsb3VkRm9ybWF0aW9uXG4gKiBjYW5ub3QgYWN0dWFsbHkgcGFyc2UsIGJ1dCBpcyBjb21wcmVoZW5zaWJsZSB0byBodW1hbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJbnRyaW5zaWNzKHg6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHguZmlsdGVyKGVsID0+ICFpc05vVmFsdWUoZWwpKS5tYXAocmVuZGVySW50cmluc2ljcyk7XG4gIH1cblxuICBpZiAoaXNOb1ZhbHVlKHgpKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICBjb25zdCBpbnRyaW5zaWMgPSBnZXRJbnRyaW5zaWMoeCk7XG4gIGlmIChpbnRyaW5zaWMpIHtcbiAgICBpZiAoaW50cmluc2ljLmZuID09PSAnUmVmJykgeyByZXR1cm4gJyR7JyArIGludHJpbnNpYy5hcmdzICsgJ30nOyB9XG4gICAgaWYgKGludHJpbnNpYy5mbiA9PT0gJ0ZuOjpHZXRBdHQnKSB7IHJldHVybiAnJHsnICsgaW50cmluc2ljLmFyZ3NbMF0gKyAnLicgKyBpbnRyaW5zaWMuYXJnc1sxXSArICd9JzsgfVxuICAgIGlmIChpbnRyaW5zaWMuZm4gPT09ICdGbjo6Sm9pbicpIHsgcmV0dXJuIHVuQ2xvdWRGb3JtYXRpb25GbkpvaW4oaW50cmluc2ljLmFyZ3NbMF0sIGludHJpbnNpYy5hcmdzWzFdKTsgfVxuICAgIHJldHVybiBzdHJpbmdpZnlJbnRyaW5zaWMoaW50cmluc2ljLmZuLCBpbnRyaW5zaWMuYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpIHtcbiAgICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHgpKSB7XG4gICAgICBpZiAoIWlzTm9WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0W2tleV0gPSByZW5kZXJJbnRyaW5zaWNzKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gdW5DbG91ZEZvcm1hdGlvbkZuSm9pbihzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgcmV0dXJuIGFyZ3MuZmlsdGVyKGVsID0+ICFpc05vVmFsdWUoZWwpKS5tYXAocmVuZGVySW50cmluc2ljcykuam9pbihzZXBhcmF0b3IpO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZnlJbnRyaW5zaWMoJ0ZuOjpKb2luJywgW3NlcGFyYXRvciwgYXJnc10pO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbnRyaW5zaWMoZm46IHN0cmluZywgYXJnczogYW55KSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IFtmbl06IHJlbmRlckludHJpbnNpY3MoYXJncykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEludHJpbnNpYyh4OiBhbnkpOiBJbnRyaW5zaWMgfCB1bmRlZmluZWQge1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh4KSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeCk7XG4gIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMSAmJiAoa2V5c1swXSA9PT0gJ1JlZicgfHwga2V5c1swXS5zdGFydHNXaXRoKCdGbjo6JykpID8geyBmbjoga2V5c1swXSwgYXJnczogeFtrZXlzWzBdXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc05vVmFsdWUoeDogYW55KSB7XG4gIGNvbnN0IGludCA9IGdldEludHJpbnNpYyh4KTtcbiAgcmV0dXJuIGludCAmJiBpbnQuZm4gPT09ICdSZWYnICYmIGludC5hcmdzID09PSAnQVdTOjpOb1ZhbHVlJztcbn1cblxuaW50ZXJmYWNlIEludHJpbnNpYyB7XG4gIGZuOiBzdHJpbmc7XG4gIGFyZ3M6IGFueTtcbn1cbiJdfQ==
|
package/lib/util.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn a (multi-key) extraction function into a comparator for use in Array.sort()
|
|
3
|
+
*/
|
|
4
|
+
export declare function makeComparator<T, U>(keyFn: (x: T) => U[]): (a: T, b: T) => number;
|
|
5
|
+
export declare function dropIfEmpty<T>(xs: T[]): T[] | undefined;
|
|
6
|
+
export declare function deepRemoveUndefined(x: any): any;
|
|
7
|
+
export declare function flatMap<T, U>(xs: T[], f: (x: T) => U[]): U[];
|
package/lib/util.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeComparator = makeComparator;
|
|
4
|
+
exports.dropIfEmpty = dropIfEmpty;
|
|
5
|
+
exports.deepRemoveUndefined = deepRemoveUndefined;
|
|
6
|
+
exports.flatMap = flatMap;
|
|
7
|
+
/**
|
|
8
|
+
* Turn a (multi-key) extraction function into a comparator for use in Array.sort()
|
|
9
|
+
*/
|
|
10
|
+
function makeComparator(keyFn) {
|
|
11
|
+
return (a, b) => {
|
|
12
|
+
const keyA = keyFn(a);
|
|
13
|
+
const keyB = keyFn(b);
|
|
14
|
+
const len = Math.min(keyA.length, keyB.length);
|
|
15
|
+
for (let i = 0; i < len; i++) {
|
|
16
|
+
const c = compare(keyA[i], keyB[i]);
|
|
17
|
+
if (c !== 0) {
|
|
18
|
+
return c;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Arrays are the same up to the min length -- shorter array sorts first
|
|
22
|
+
return keyA.length - keyB.length;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function compare(a, b) {
|
|
26
|
+
if (a < b) {
|
|
27
|
+
return -1;
|
|
28
|
+
}
|
|
29
|
+
if (b < a) {
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
function dropIfEmpty(xs) {
|
|
35
|
+
return xs.length > 0 ? xs : undefined;
|
|
36
|
+
}
|
|
37
|
+
function deepRemoveUndefined(x) {
|
|
38
|
+
if (typeof x === undefined || x === null) {
|
|
39
|
+
return x;
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(x)) {
|
|
42
|
+
return x.map(deepRemoveUndefined);
|
|
43
|
+
}
|
|
44
|
+
if (typeof x === 'object') {
|
|
45
|
+
for (const [key, value] of Object.entries(x)) {
|
|
46
|
+
x[key] = deepRemoveUndefined(value);
|
|
47
|
+
if (x[key] === undefined) {
|
|
48
|
+
delete x[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return x;
|
|
52
|
+
}
|
|
53
|
+
return x;
|
|
54
|
+
}
|
|
55
|
+
function flatMap(xs, f) {
|
|
56
|
+
const ret = new Array();
|
|
57
|
+
for (const x of xs) {
|
|
58
|
+
ret.push(...f(x));
|
|
59
|
+
}
|
|
60
|
+
return ret;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSx3Q0FjQztBQVFELGtDQUVDO0FBRUQsa0RBV0M7QUFFRCwwQkFNQztBQWhERDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBTyxLQUFvQjtJQUN2RCxPQUFPLENBQUMsQ0FBSSxFQUFFLENBQUksRUFBRSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFBQyxPQUFPLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUksQ0FBSSxFQUFFLENBQUk7SUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUN4QixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUksRUFBTztJQUNwQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsQ0FBTTtJQUN4QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFBQyxPQUFPLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDNUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQWdCLE9BQU8sQ0FBTyxFQUFPLEVBQUUsQ0FBZ0I7SUFDckQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUssQ0FBQztJQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUdXJuIGEgKG11bHRpLWtleSkgZXh0cmFjdGlvbiBmdW5jdGlvbiBpbnRvIGEgY29tcGFyYXRvciBmb3IgdXNlIGluIEFycmF5LnNvcnQoKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbXBhcmF0b3I8VCwgVT4oa2V5Rm46ICh4OiBUKSA9PiBVW10pIHtcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3Qga2V5QSA9IGtleUZuKGEpO1xuICAgIGNvbnN0IGtleUIgPSBrZXlGbihiKTtcbiAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihrZXlBLmxlbmd0aCwga2V5Qi5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IGNvbXBhcmUoa2V5QVtpXSwga2V5QltpXSk7XG4gICAgICBpZiAoYyAhPT0gMCkgeyByZXR1cm4gYzsgfVxuICAgIH1cblxuICAgIC8vIEFycmF5cyBhcmUgdGhlIHNhbWUgdXAgdG8gdGhlIG1pbiBsZW5ndGggLS0gc2hvcnRlciBhcnJheSBzb3J0cyBmaXJzdFxuICAgIHJldHVybiBrZXlBLmxlbmd0aCAtIGtleUIubGVuZ3RoO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wYXJlPFQ+KGE6IFQsIGI6IFQpIHtcbiAgaWYgKGEgPCBiKSB7IHJldHVybiAtMTsgfVxuICBpZiAoYiA8IGEpIHsgcmV0dXJuIDE7IH1cbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcm9wSWZFbXB0eTxUPih4czogVFtdKTogVFtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHhzLmxlbmd0aCA+IDAgPyB4cyA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBSZW1vdmVVbmRlZmluZWQoeDogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiB4ID09PSB1bmRlZmluZWQgfHwgeCA9PT0gbnVsbCkgeyByZXR1cm4geDsgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkgeyByZXR1cm4geC5tYXAoZGVlcFJlbW92ZVVuZGVmaW5lZCk7IH1cbiAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHgpKSB7XG4gICAgICB4W2tleV0gPSBkZWVwUmVtb3ZlVW5kZWZpbmVkKHZhbHVlKTtcbiAgICAgIGlmICh4W2tleV0gPT09IHVuZGVmaW5lZCkgeyBkZWxldGUgeFtrZXldOyB9XG4gICAgfVxuICAgIHJldHVybiB4O1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhdE1hcDxULCBVPih4czogVFtdLCBmOiAoeDogVCkgPT4gVVtdKTogVVtdIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFU+KCk7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHJldC5wdXNoKC4uLmYoeCkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aws-cdk/cloudformation-diff",
|
|
3
|
+
"description": "Utilities to diff CDK stacks against CloudFormation templates",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/aws/aws-cdk-cli",
|
|
7
|
+
"directory": "packages/@aws-cdk/cloudformation-diff"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "npx projen build",
|
|
11
|
+
"bump": "npx projen bump",
|
|
12
|
+
"check-for-updates": "npx projen check-for-updates",
|
|
13
|
+
"compile": "npx projen compile",
|
|
14
|
+
"default": "npx projen default",
|
|
15
|
+
"eslint": "npx projen eslint",
|
|
16
|
+
"gather-versions": "npx projen gather-versions",
|
|
17
|
+
"package": "npx projen package",
|
|
18
|
+
"post-compile": "npx projen post-compile",
|
|
19
|
+
"pre-compile": "npx projen pre-compile",
|
|
20
|
+
"test": "npx projen test",
|
|
21
|
+
"test:watch": "npx projen test:watch",
|
|
22
|
+
"unbump": "npx projen unbump",
|
|
23
|
+
"watch": "npx projen watch",
|
|
24
|
+
"projen": "npx projen"
|
|
25
|
+
},
|
|
26
|
+
"author": {
|
|
27
|
+
"name": "Amazon Web Services",
|
|
28
|
+
"url": "https://aws.amazon.com",
|
|
29
|
+
"organization": true
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@aws-sdk/client-cloudformation": "^3.744.0",
|
|
33
|
+
"@cdklabs/eslint-plugin": "^1.3.2",
|
|
34
|
+
"@stylistic/eslint-plugin": "^3.1.0",
|
|
35
|
+
"@types/jest": "^29.5.14",
|
|
36
|
+
"@types/node": "^16",
|
|
37
|
+
"@typescript-eslint/eslint-plugin": "^8",
|
|
38
|
+
"@typescript-eslint/parser": "^8",
|
|
39
|
+
"commit-and-tag-version": "^12",
|
|
40
|
+
"constructs": "^10.0.0",
|
|
41
|
+
"eslint": "^9",
|
|
42
|
+
"eslint-config-prettier": "^10.0.1",
|
|
43
|
+
"eslint-import-resolver-typescript": "^3.7.0",
|
|
44
|
+
"eslint-plugin-import": "^2.31.0",
|
|
45
|
+
"eslint-plugin-jest": "^28.11.0",
|
|
46
|
+
"eslint-plugin-prettier": "^5.2.3",
|
|
47
|
+
"fast-check": "^3.23.2",
|
|
48
|
+
"jest": "^29.7.0",
|
|
49
|
+
"jest-junit": "^15",
|
|
50
|
+
"prettier": "^2.8",
|
|
51
|
+
"projen": "^0.91.9",
|
|
52
|
+
"ts-jest": "^29.2.5",
|
|
53
|
+
"typescript": "5.6"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@aws-cdk/aws-service-spec": "^0.1.52",
|
|
57
|
+
"@aws-cdk/service-spec-types": "^0.0.118",
|
|
58
|
+
"chalk": "^4",
|
|
59
|
+
"diff": "^7.0.0",
|
|
60
|
+
"fast-deep-equal": "^3.1.3",
|
|
61
|
+
"string-width": "^4",
|
|
62
|
+
"table": "^6"
|
|
63
|
+
},
|
|
64
|
+
"keywords": [
|
|
65
|
+
"aws",
|
|
66
|
+
"cdk"
|
|
67
|
+
],
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">= 16.0.0"
|
|
70
|
+
},
|
|
71
|
+
"main": "lib/index.js",
|
|
72
|
+
"license": "Apache-2.0",
|
|
73
|
+
"homepage": "https://github.com/aws/aws-cdk",
|
|
74
|
+
"publishConfig": {
|
|
75
|
+
"access": "public"
|
|
76
|
+
},
|
|
77
|
+
"version": "0.0.0",
|
|
78
|
+
"types": "lib/index.d.ts",
|
|
79
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
|
|
80
|
+
}
|