@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,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatTable = formatTable;
|
|
4
|
+
const chalk = require("chalk");
|
|
5
|
+
const string_width_1 = require("string-width");
|
|
6
|
+
const table = require("table");
|
|
7
|
+
/**
|
|
8
|
+
* Render a two-dimensional array to a visually attractive table
|
|
9
|
+
*
|
|
10
|
+
* First row is considered the table header.
|
|
11
|
+
*/
|
|
12
|
+
function formatTable(cells, columns) {
|
|
13
|
+
return table.table(cells, {
|
|
14
|
+
border: TABLE_BORDER_CHARACTERS,
|
|
15
|
+
columns: buildColumnConfig(columns !== undefined ? calculateColumnWidths(cells, columns) : undefined),
|
|
16
|
+
drawHorizontalLine: (line) => {
|
|
17
|
+
// Numbering like this: [line 0] [header = row[0]] [line 1] [row 1] [line 2] [content 2] [line 3]
|
|
18
|
+
return (line < 2 || line === cells.length) || lineBetween(cells[line - 1], cells[line]);
|
|
19
|
+
},
|
|
20
|
+
}).trimRight();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether we should draw a line between two rows
|
|
24
|
+
*
|
|
25
|
+
* Draw horizontal line if 2nd column values are different.
|
|
26
|
+
*/
|
|
27
|
+
function lineBetween(rowA, rowB) {
|
|
28
|
+
return rowA[1] !== rowB[1];
|
|
29
|
+
}
|
|
30
|
+
function buildColumnConfig(widths) {
|
|
31
|
+
if (widths === undefined) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const ret = {};
|
|
35
|
+
widths.forEach((width, i) => {
|
|
36
|
+
if (width === undefined) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
ret[i] = { width };
|
|
40
|
+
});
|
|
41
|
+
return ret;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculate column widths given a terminal width
|
|
45
|
+
*
|
|
46
|
+
* We do this by calculating a fair share for every column. Extra width smaller
|
|
47
|
+
* than the fair share is evenly distributed over all columns that exceed their
|
|
48
|
+
* fair share.
|
|
49
|
+
*/
|
|
50
|
+
function calculateColumnWidths(rows, terminalWidth) {
|
|
51
|
+
// The terminal is sometimes reported to be 0. Also if the terminal is VERY narrow,
|
|
52
|
+
// just assume a reasonable minimum size.
|
|
53
|
+
terminalWidth = Math.max(terminalWidth, 40);
|
|
54
|
+
// use 'string-width' to not count ANSI chars as actual character width
|
|
55
|
+
const columns = rows[0].map((_, i) => Math.max(...rows.map(row => (0, string_width_1.default)(String(row[i])))));
|
|
56
|
+
// If we have no terminal width, do nothing
|
|
57
|
+
const contentWidth = terminalWidth - 2 - columns.length * 3;
|
|
58
|
+
// If we don't exceed the terminal width, do nothing
|
|
59
|
+
if (sum(columns) <= contentWidth) {
|
|
60
|
+
return columns;
|
|
61
|
+
}
|
|
62
|
+
const fairShare = Math.min(contentWidth / columns.length);
|
|
63
|
+
const smallColumns = columns.filter(w => w < fairShare);
|
|
64
|
+
let distributableWidth = contentWidth - sum(smallColumns);
|
|
65
|
+
const fairDistributable = Math.floor(distributableWidth / (columns.length - smallColumns.length));
|
|
66
|
+
const ret = new Array();
|
|
67
|
+
for (const requestedWidth of columns) {
|
|
68
|
+
if (requestedWidth < fairShare) {
|
|
69
|
+
// Small column gets what they want
|
|
70
|
+
ret.push(requestedWidth);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Last column gets all remaining, otherwise get fair redist share
|
|
74
|
+
const width = distributableWidth < 2 * fairDistributable ? distributableWidth : fairDistributable;
|
|
75
|
+
ret.push(width);
|
|
76
|
+
distributableWidth -= width;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return ret;
|
|
80
|
+
}
|
|
81
|
+
function sum(xs) {
|
|
82
|
+
let total = 0;
|
|
83
|
+
for (const x of xs) {
|
|
84
|
+
total += x;
|
|
85
|
+
}
|
|
86
|
+
return total;
|
|
87
|
+
}
|
|
88
|
+
// What color the table is going to be
|
|
89
|
+
const tableColor = chalk.gray;
|
|
90
|
+
// Unicode table characters with a color
|
|
91
|
+
const TABLE_BORDER_CHARACTERS = {
|
|
92
|
+
topBody: tableColor('─'),
|
|
93
|
+
topJoin: tableColor('┬'),
|
|
94
|
+
topLeft: tableColor('┌'),
|
|
95
|
+
topRight: tableColor('┐'),
|
|
96
|
+
bottomBody: tableColor('─'),
|
|
97
|
+
bottomJoin: tableColor('┴'),
|
|
98
|
+
bottomLeft: tableColor('└'),
|
|
99
|
+
bottomRight: tableColor('┘'),
|
|
100
|
+
bodyLeft: tableColor('│'),
|
|
101
|
+
bodyRight: tableColor('│'),
|
|
102
|
+
bodyJoin: tableColor('│'),
|
|
103
|
+
joinBody: tableColor('─'),
|
|
104
|
+
joinLeft: tableColor('├'),
|
|
105
|
+
joinRight: tableColor('┤'),
|
|
106
|
+
joinJoin: tableColor('┼'),
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esa0NBU0M7QUFsQkQsK0JBQStCO0FBQy9CLCtDQUF1QztBQUN2QywrQkFBK0I7QUFFL0I7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFpQixFQUFFLE9BQTJCO0lBQ3hFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7UUFDeEIsTUFBTSxFQUFFLHVCQUF1QjtRQUMvQixPQUFPLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDckcsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixpR0FBaUc7WUFDakcsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDO0tBQ0YsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBYyxFQUFFLElBQWM7SUFDakQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQTRCO0lBQ3JELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBRS9DLE1BQU0sR0FBRyxHQUFnRCxFQUFFLENBQUM7SUFDNUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxJQUFnQixFQUFFLGFBQXFCO0lBQ3BFLG1GQUFtRjtJQUNuRix5Q0FBeUM7SUFDekMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTVDLHVFQUF1RTtJQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFBLHNCQUFXLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakcsMkNBQTJDO0lBQzNDLE1BQU0sWUFBWSxHQUFHLGFBQWEsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFNUQsb0RBQW9EO0lBQ3BELElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQUMsT0FBTyxPQUFPLENBQUM7SUFBQyxDQUFDO0lBRXJELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXhELElBQUksa0JBQWtCLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWxHLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDaEMsS0FBSyxNQUFNLGNBQWMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLGNBQWMsR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUMvQixtQ0FBbUM7WUFDbkMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLGtFQUFrRTtZQUNsRSxNQUFNLEtBQUssR0FBRyxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztZQUNsRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLGtCQUFrQixJQUFJLEtBQUssQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLEVBQVk7SUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQixLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELHNDQUFzQztBQUN0QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBRTlCLHdDQUF3QztBQUN4QyxNQUFNLHVCQUF1QixHQUFHO0lBQzlCLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3hCLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3hCLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3pCLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzNCLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzNCLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzVCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3pCLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzFCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3pCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3pCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3pCLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzFCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgc3RyaW5nV2lkdGggZnJvbSAnc3RyaW5nLXdpZHRoJztcbmltcG9ydCAqIGFzIHRhYmxlIGZyb20gJ3RhYmxlJztcblxuLyoqXG4gKiBSZW5kZXIgYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgdG8gYSB2aXN1YWxseSBhdHRyYWN0aXZlIHRhYmxlXG4gKlxuICogRmlyc3Qgcm93IGlzIGNvbnNpZGVyZWQgdGhlIHRhYmxlIGhlYWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRhYmxlKGNlbGxzOiBzdHJpbmdbXVtdLCBjb2x1bW5zOiBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gdGFibGUudGFibGUoY2VsbHMsIHtcbiAgICBib3JkZXI6IFRBQkxFX0JPUkRFUl9DSEFSQUNURVJTLFxuICAgIGNvbHVtbnM6IGJ1aWxkQ29sdW1uQ29uZmlnKGNvbHVtbnMgIT09IHVuZGVmaW5lZCA/IGNhbGN1bGF0ZUNvbHVtbldpZHRocyhjZWxscywgY29sdW1ucykgOiB1bmRlZmluZWQpLFxuICAgIGRyYXdIb3Jpem9udGFsTGluZTogKGxpbmUpID0+IHtcbiAgICAgIC8vIE51bWJlcmluZyBsaWtlIHRoaXM6IFtsaW5lIDBdIFtoZWFkZXIgPSByb3dbMF1dIFtsaW5lIDFdIFtyb3cgMV0gW2xpbmUgMl0gW2NvbnRlbnQgMl0gW2xpbmUgM11cbiAgICAgIHJldHVybiAobGluZSA8IDIgfHwgbGluZSA9PT0gY2VsbHMubGVuZ3RoKSB8fCBsaW5lQmV0d2VlbihjZWxsc1tsaW5lIC0gMV0sIGNlbGxzW2xpbmVdKTtcbiAgICB9LFxuICB9KS50cmltUmlnaHQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHdlIHNob3VsZCBkcmF3IGEgbGluZSBiZXR3ZWVuIHR3byByb3dzXG4gKlxuICogRHJhdyBob3Jpem9udGFsIGxpbmUgaWYgMm5kIGNvbHVtbiB2YWx1ZXMgYXJlIGRpZmZlcmVudC5cbiAqL1xuZnVuY3Rpb24gbGluZUJldHdlZW4ocm93QTogc3RyaW5nW10sIHJvd0I6IHN0cmluZ1tdKSB7XG4gIHJldHVybiByb3dBWzFdICE9PSByb3dCWzFdO1xufVxuXG5mdW5jdGlvbiBidWlsZENvbHVtbkNvbmZpZyh3aWR0aHM6IG51bWJlcltdIHwgdW5kZWZpbmVkKTogeyBbaW5kZXg6IG51bWJlcl06IHRhYmxlLkNvbHVtblVzZXJDb25maWcgfSB8IHVuZGVmaW5lZCB7XG4gIGlmICh3aWR0aHMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG5cbiAgY29uc3QgcmV0OiB7IFtpbmRleDogbnVtYmVyXTogdGFibGUuQ29sdW1uVXNlckNvbmZpZyB9ID0ge307XG4gIHdpZHRocy5mb3JFYWNoKCh3aWR0aCwgaSkgPT4ge1xuICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldFtpXSA9IHsgd2lkdGggfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgY29sdW1uIHdpZHRocyBnaXZlbiBhIHRlcm1pbmFsIHdpZHRoXG4gKlxuICogV2UgZG8gdGhpcyBieSBjYWxjdWxhdGluZyBhIGZhaXIgc2hhcmUgZm9yIGV2ZXJ5IGNvbHVtbi4gRXh0cmEgd2lkdGggc21hbGxlclxuICogdGhhbiB0aGUgZmFpciBzaGFyZSBpcyBldmVubHkgZGlzdHJpYnV0ZWQgb3ZlciBhbGwgY29sdW1ucyB0aGF0IGV4Y2VlZCB0aGVpclxuICogZmFpciBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQ29sdW1uV2lkdGhzKHJvd3M6IHN0cmluZ1tdW10sIHRlcm1pbmFsV2lkdGg6IG51bWJlcik6IG51bWJlcltdIHtcbiAgLy8gVGhlIHRlcm1pbmFsIGlzIHNvbWV0aW1lcyByZXBvcnRlZCB0byBiZSAwLiBBbHNvIGlmIHRoZSB0ZXJtaW5hbCBpcyBWRVJZIG5hcnJvdyxcbiAgLy8ganVzdCBhc3N1bWUgYSByZWFzb25hYmxlIG1pbmltdW0gc2l6ZS5cbiAgdGVybWluYWxXaWR0aCA9IE1hdGgubWF4KHRlcm1pbmFsV2lkdGgsIDQwKTtcblxuICAvLyB1c2UgJ3N0cmluZy13aWR0aCcgdG8gbm90IGNvdW50IEFOU0kgY2hhcnMgYXMgYWN0dWFsIGNoYXJhY3RlciB3aWR0aFxuICBjb25zdCBjb2x1bW5zID0gcm93c1swXS5tYXAoKF8sIGkpID0+IE1hdGgubWF4KC4uLnJvd3MubWFwKHJvdyA9PiBzdHJpbmdXaWR0aChTdHJpbmcocm93W2ldKSkpKSk7XG5cbiAgLy8gSWYgd2UgaGF2ZSBubyB0ZXJtaW5hbCB3aWR0aCwgZG8gbm90aGluZ1xuICBjb25zdCBjb250ZW50V2lkdGggPSB0ZXJtaW5hbFdpZHRoIC0gMiAtIGNvbHVtbnMubGVuZ3RoICogMztcblxuICAvLyBJZiB3ZSBkb24ndCBleGNlZWQgdGhlIHRlcm1pbmFsIHdpZHRoLCBkbyBub3RoaW5nXG4gIGlmIChzdW0oY29sdW1ucykgPD0gY29udGVudFdpZHRoKSB7IHJldHVybiBjb2x1bW5zOyB9XG5cbiAgY29uc3QgZmFpclNoYXJlID0gTWF0aC5taW4oY29udGVudFdpZHRoIC8gY29sdW1ucy5sZW5ndGgpO1xuICBjb25zdCBzbWFsbENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcih3ID0+IHcgPCBmYWlyU2hhcmUpO1xuXG4gIGxldCBkaXN0cmlidXRhYmxlV2lkdGggPSBjb250ZW50V2lkdGggLSBzdW0oc21hbGxDb2x1bW5zKTtcbiAgY29uc3QgZmFpckRpc3RyaWJ1dGFibGUgPSBNYXRoLmZsb29yKGRpc3RyaWJ1dGFibGVXaWR0aCAvIChjb2x1bW5zLmxlbmd0aCAtIHNtYWxsQ29sdW1ucy5sZW5ndGgpKTtcblxuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IHJlcXVlc3RlZFdpZHRoIG9mIGNvbHVtbnMpIHtcbiAgICBpZiAocmVxdWVzdGVkV2lkdGggPCBmYWlyU2hhcmUpIHtcbiAgICAgIC8vIFNtYWxsIGNvbHVtbiBnZXRzIHdoYXQgdGhleSB3YW50XG4gICAgICByZXQucHVzaChyZXF1ZXN0ZWRXaWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExhc3QgY29sdW1uIGdldHMgYWxsIHJlbWFpbmluZywgb3RoZXJ3aXNlIGdldCBmYWlyIHJlZGlzdCBzaGFyZVxuICAgICAgY29uc3Qgd2lkdGggPSBkaXN0cmlidXRhYmxlV2lkdGggPCAyICogZmFpckRpc3RyaWJ1dGFibGUgPyBkaXN0cmlidXRhYmxlV2lkdGggOiBmYWlyRGlzdHJpYnV0YWJsZTtcbiAgICAgIHJldC5wdXNoKHdpZHRoKTtcbiAgICAgIGRpc3RyaWJ1dGFibGVXaWR0aCAtPSB3aWR0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBzdW0oeHM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IHRvdGFsID0gMDtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgdG90YWwgKz0geDtcbiAgfVxuICByZXR1cm4gdG90YWw7XG59XG5cbi8vIFdoYXQgY29sb3IgdGhlIHRhYmxlIGlzIGdvaW5nIHRvIGJlXG5jb25zdCB0YWJsZUNvbG9yID0gY2hhbGsuZ3JheTtcblxuLy8gVW5pY29kZSB0YWJsZSBjaGFyYWN0ZXJzIHdpdGggYSBjb2xvclxuY29uc3QgVEFCTEVfQk9SREVSX0NIQVJBQ1RFUlMgPSB7XG4gIHRvcEJvZHk6IHRhYmxlQ29sb3IoJ+KUgCcpLFxuICB0b3BKb2luOiB0YWJsZUNvbG9yKCfilKwnKSxcbiAgdG9wTGVmdDogdGFibGVDb2xvcign4pSMJyksXG4gIHRvcFJpZ2h0OiB0YWJsZUNvbG9yKCfilJAnKSxcbiAgYm90dG9tQm9keTogdGFibGVDb2xvcign4pSAJyksXG4gIGJvdHRvbUpvaW46IHRhYmxlQ29sb3IoJ+KUtCcpLFxuICBib3R0b21MZWZ0OiB0YWJsZUNvbG9yKCfilJQnKSxcbiAgYm90dG9tUmlnaHQ6IHRhYmxlQ29sb3IoJ+KUmCcpLFxuICBib2R5TGVmdDogdGFibGVDb2xvcign4pSCJyksXG4gIGJvZHlSaWdodDogdGFibGVDb2xvcign4pSCJyksXG4gIGJvZHlKb2luOiB0YWJsZUNvbG9yKCfilIInKSxcbiAgam9pbkJvZHk6IHRhYmxlQ29sb3IoJ+KUgCcpLFxuICBqb2luTGVmdDogdGFibGVDb2xvcign4pScJyksXG4gIGpvaW5SaWdodDogdGFibGVDb2xvcign4pSkJyksXG4gIGpvaW5Kb2luOiB0YWJsZUNvbG9yKCfilLwnKSxcbn07XG4iXX0=
|
package/lib/format.d.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { DifferenceCollection, TemplateDiff } from './diff/types';
|
|
2
|
+
import { Difference, ResourceDifference, ResourceImpact } from './diff-template';
|
|
3
|
+
import { IamChanges } from './iam/iam-changes';
|
|
4
|
+
import { SecurityGroupChanges } from './network/security-group-changes';
|
|
5
|
+
export interface FormatStream extends NodeJS.WritableStream {
|
|
6
|
+
columns?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Renders template differences to the process' console.
|
|
10
|
+
*
|
|
11
|
+
* @param stream The IO stream where to output the rendered diff.
|
|
12
|
+
* @param templateDiff TemplateDiff to be rendered to the console.
|
|
13
|
+
* @param logicalToPathMap A map from logical ID to construct path. Useful in
|
|
14
|
+
* case there is no aws:cdk:path metadata in the template.
|
|
15
|
+
* @param context the number of context lines to use in arbitrary JSON diff (defaults to 3).
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatDifferences(stream: FormatStream, templateDiff: TemplateDiff, logicalToPathMap?: {
|
|
18
|
+
[logicalId: string]: string;
|
|
19
|
+
}, context?: number): void;
|
|
20
|
+
/**
|
|
21
|
+
* Renders a diff of security changes to the given stream
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatSecurityChanges(stream: NodeJS.WritableStream, templateDiff: TemplateDiff, logicalToPathMap?: {
|
|
24
|
+
[logicalId: string]: string;
|
|
25
|
+
}, context?: number): void;
|
|
26
|
+
export declare class Formatter {
|
|
27
|
+
private readonly stream;
|
|
28
|
+
private readonly logicalToPathMap;
|
|
29
|
+
private readonly context;
|
|
30
|
+
constructor(stream: FormatStream, logicalToPathMap: {
|
|
31
|
+
[logicalId: string]: string;
|
|
32
|
+
}, diff?: TemplateDiff, context?: number);
|
|
33
|
+
print(fmt: string, ...args: any[]): void;
|
|
34
|
+
warning(fmt: string, ...args: any[]): void;
|
|
35
|
+
formatSection<V, T extends Difference<V>>(title: string, entryType: string, collection: DifferenceCollection<V, T>, formatter?: (type: string, id: string, diff: T) => void): void;
|
|
36
|
+
printSectionHeader(title: string): void;
|
|
37
|
+
printSectionFooter(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Print a simple difference for a given named entity.
|
|
40
|
+
*
|
|
41
|
+
* @param logicalId the name of the entity that is different.
|
|
42
|
+
* @param diff the difference to be rendered.
|
|
43
|
+
*/
|
|
44
|
+
formatDifference(type: string, logicalId: string, diff: Difference<any> | undefined): void;
|
|
45
|
+
/**
|
|
46
|
+
* Print a resource difference for a given logical ID.
|
|
47
|
+
*
|
|
48
|
+
* @param logicalId the logical ID of the resource that changed.
|
|
49
|
+
* @param diff the change to be rendered.
|
|
50
|
+
*/
|
|
51
|
+
formatResourceDifference(_type: string, logicalId: string, diff: ResourceDifference): void;
|
|
52
|
+
formatResourcePrefix(diff: ResourceDifference): string;
|
|
53
|
+
formatPrefix<T>(diff: Difference<T>): string;
|
|
54
|
+
/**
|
|
55
|
+
* @param value the value to be formatted.
|
|
56
|
+
* @param color the color to be used.
|
|
57
|
+
*
|
|
58
|
+
* @returns the formatted string, with color applied.
|
|
59
|
+
*/
|
|
60
|
+
formatValue(value: any, color: (str: string) => string): string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* @param impact the impact to be formatted
|
|
63
|
+
* @returns a user-friendly, colored string representing the impact.
|
|
64
|
+
*/
|
|
65
|
+
formatImpact(impact: ResourceImpact): string;
|
|
66
|
+
/**
|
|
67
|
+
* Renders a tree of differences under a particular name.
|
|
68
|
+
* @param name the name of the root of the tree.
|
|
69
|
+
* @param diff the difference on the tree.
|
|
70
|
+
* @param last whether this is the last node of a parent tree.
|
|
71
|
+
*/
|
|
72
|
+
formatTreeDiff(name: string, diff: Difference<any>, last: boolean): void;
|
|
73
|
+
/**
|
|
74
|
+
* Renders the difference between two objects, looking for the differences as deep as possible,
|
|
75
|
+
* and rendering a tree graph of the path until the difference is found.
|
|
76
|
+
*
|
|
77
|
+
* @param oldObject the old object.
|
|
78
|
+
* @param newObject the new object.
|
|
79
|
+
* @param linePrefix a prefix (indent-like) to be used on every line.
|
|
80
|
+
*/
|
|
81
|
+
formatObjectDiff(oldObject: any, newObject: any, linePrefix: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* @param oldValue the old value of a difference.
|
|
84
|
+
* @param newValue the new value of a difference.
|
|
85
|
+
*
|
|
86
|
+
* @returns a tag to be rendered in the diff, reflecting whether the difference
|
|
87
|
+
* was an ADDITION, UPDATE or REMOVAL.
|
|
88
|
+
*/
|
|
89
|
+
changeTag(oldValue: any | undefined, newValue: any | undefined): string;
|
|
90
|
+
/**
|
|
91
|
+
* Find 'aws:cdk:path' metadata in the diff and add it to the logicalToPathMap
|
|
92
|
+
*
|
|
93
|
+
* There are multiple sources of logicalID -> path mappings: synth metadata
|
|
94
|
+
* and resource metadata, and we combine all sources into a single map.
|
|
95
|
+
*/
|
|
96
|
+
readConstructPathsFrom(templateDiff: TemplateDiff): void;
|
|
97
|
+
formatLogicalId(logicalId: string): string;
|
|
98
|
+
normalizedLogicalIdPath(logicalId: string): string | undefined;
|
|
99
|
+
formatIamChanges(changes: IamChanges): void;
|
|
100
|
+
formatSecurityGroupChanges(changes: SecurityGroupChanges): void;
|
|
101
|
+
deepSubstituteBracedLogicalIds(rows: string[][]): string[][];
|
|
102
|
+
/**
|
|
103
|
+
* Substitute all strings like ${LogId.xxx} with the path instead of the logical ID
|
|
104
|
+
*/
|
|
105
|
+
substituteBracedLogicalIds(source: string): string;
|
|
106
|
+
}
|