@znemz/cfn-include 4.1.8 → 4.2.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/README.md +1 -0
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -1
- package/dist/lib/stats.d.ts +58 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +118 -0
- package/dist/lib/stats.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -96,6 +96,7 @@ Options:
|
|
|
96
96
|
* `--doLog` console log out include options in recurse step. Shows caller parameter to aid debugging nested function calls.
|
|
97
97
|
* `--ref-now-ignore-missing` do not fail if `Fn::RefNow` reference cannot be resolved; instead return in standard CloudFormation `Ref` syntax
|
|
98
98
|
* `--ref-now-ignores <names>` comma-separated list of reference names to ignore if not found (e.g., `OptionalRef1,OptionalRef2`)
|
|
99
|
+
* `--stats` report template statistics and CloudFormation limit warnings to stderr. Includes resource count, output count, template size (with % of CloudFormation limits), and a breakdown of resource types. Warnings are emitted when any metric reaches 80% of its limit. Output goes to stderr so it does not interfere with template output on stdout.
|
|
99
100
|
`cfn-include` also accepts a template passed from stdin
|
|
100
101
|
|
|
101
102
|
```
|
package/dist/cli.js
CHANGED
|
@@ -8,6 +8,7 @@ import include from './index.js';
|
|
|
8
8
|
import * as yaml from './lib/yaml.js';
|
|
9
9
|
import Client from './lib/cfnclient.js';
|
|
10
10
|
import replaceEnv from './lib/replaceEnv.js';
|
|
11
|
+
import { computeStats, checkThresholds, formatStatsReport } from './lib/stats.js';
|
|
11
12
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
13
|
const __dirname = path.dirname(__filename);
|
|
13
14
|
// Read package.json using fs instead of import assertion
|
|
@@ -80,6 +81,11 @@ const opts = yargs(hideBin(process.argv))
|
|
|
80
81
|
boolean: true,
|
|
81
82
|
desc: `console log out include options in recurse step`,
|
|
82
83
|
},
|
|
84
|
+
stats: {
|
|
85
|
+
desc: 'report template statistics and CloudFormation limit warnings to stderr',
|
|
86
|
+
default: false,
|
|
87
|
+
boolean: true,
|
|
88
|
+
},
|
|
83
89
|
'ref-now-ignore-missing': {
|
|
84
90
|
boolean: true,
|
|
85
91
|
desc: 'do not fail if Fn::RefNow reference cannot be resolved',
|
|
@@ -182,6 +188,21 @@ promise
|
|
|
182
188
|
return template;
|
|
183
189
|
})
|
|
184
190
|
.then((template) => {
|
|
191
|
+
// Template stats and warnings
|
|
192
|
+
if (opts.stats) {
|
|
193
|
+
const serialized = JSON.stringify(template);
|
|
194
|
+
const stats = computeStats(template, serialized);
|
|
195
|
+
console.error(formatStatsReport(stats));
|
|
196
|
+
const warnings = checkThresholds(stats);
|
|
197
|
+
if (warnings.length > 0) {
|
|
198
|
+
console.error('');
|
|
199
|
+
console.error('⚠️ Warnings:');
|
|
200
|
+
for (const w of warnings) {
|
|
201
|
+
console.error(` - ${w.message}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
console.error('');
|
|
205
|
+
}
|
|
185
206
|
console.log(opts.yaml ? yaml.dump(template, { lineWidth: opts.lineWidth }) : JSON.stringify(template, null, opts.minimize ? null : 2));
|
|
186
207
|
})
|
|
187
208
|
.catch(function (err) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,UAAU,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template statistics and CloudFormation limit checks (Phase 1 of #90)
|
|
3
|
+
*
|
|
4
|
+
* CloudFormation hard limits:
|
|
5
|
+
* - 500 resources per stack
|
|
6
|
+
* - 200 outputs per stack
|
|
7
|
+
* - 1MB (1,048,576 bytes) template body size
|
|
8
|
+
*
|
|
9
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
|
10
|
+
*/
|
|
11
|
+
export interface TemplateStats {
|
|
12
|
+
resourceCount: number;
|
|
13
|
+
resourceLimit: number;
|
|
14
|
+
resourcePercent: number;
|
|
15
|
+
outputCount: number;
|
|
16
|
+
outputLimit: number;
|
|
17
|
+
outputPercent: number;
|
|
18
|
+
templateBytes: number;
|
|
19
|
+
templateLimit: number;
|
|
20
|
+
templatePercent: number;
|
|
21
|
+
resourceTypes: Record<string, number>;
|
|
22
|
+
}
|
|
23
|
+
export interface StatsWarning {
|
|
24
|
+
message: string;
|
|
25
|
+
current: number;
|
|
26
|
+
limit: number;
|
|
27
|
+
percent: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* CloudFormation service quotas — individual constants for true immutability.
|
|
31
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
|
32
|
+
*/
|
|
33
|
+
/** @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html - "Resources" */
|
|
34
|
+
export declare const CFN_RESOURCE_LIMIT: 500;
|
|
35
|
+
/** @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html - "Outputs" */
|
|
36
|
+
export declare const CFN_OUTPUT_LIMIT: 200;
|
|
37
|
+
/** @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html - "Template body size" */
|
|
38
|
+
export declare const CFN_TEMPLATE_BYTES_LIMIT: 1048576;
|
|
39
|
+
export declare const CFN_LIMITS: {
|
|
40
|
+
readonly resources: 500;
|
|
41
|
+
readonly outputs: 200;
|
|
42
|
+
readonly templateBytes: 1048576;
|
|
43
|
+
};
|
|
44
|
+
/** Warn when usage reaches this fraction of the CloudFormation limit. */
|
|
45
|
+
export declare const WARNING_THRESHOLD: 0.8;
|
|
46
|
+
/**
|
|
47
|
+
* Compute statistics for a resolved CloudFormation template.
|
|
48
|
+
*/
|
|
49
|
+
export declare function computeStats(template: any, serialized?: string): TemplateStats;
|
|
50
|
+
/**
|
|
51
|
+
* Check stats against 80% warning thresholds. Returns warnings (if any).
|
|
52
|
+
*/
|
|
53
|
+
export declare function checkThresholds(stats: TemplateStats): StatsWarning[];
|
|
54
|
+
/**
|
|
55
|
+
* Format stats as a human-readable report string.
|
|
56
|
+
*/
|
|
57
|
+
export declare function formatStatsReport(stats: TemplateStats): string;
|
|
58
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/lib/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AAEH,mHAAmH;AACnH,eAAO,MAAM,kBAAkB,EAAG,GAAY,CAAC;AAE/C,iHAAiH;AACjH,eAAO,MAAM,gBAAgB,EAAG,GAAY,CAAC;AAE7C,4HAA4H;AAC5H,eAAO,MAAM,wBAAwB,EAAG,OAAkB,CAAC;AAE3D,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,EAAG,GAAY,CAAC;AAE9C;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CA2B9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,EAAE,CAgCpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAkB9D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template statistics and CloudFormation limit checks (Phase 1 of #90)
|
|
3
|
+
*
|
|
4
|
+
* CloudFormation hard limits:
|
|
5
|
+
* - 500 resources per stack
|
|
6
|
+
* - 200 outputs per stack
|
|
7
|
+
* - 1MB (1,048,576 bytes) template body size
|
|
8
|
+
*
|
|
9
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* CloudFormation service quotas — individual constants for true immutability.
|
|
13
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
|
14
|
+
*/
|
|
15
|
+
/** @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html - "Resources" */
|
|
16
|
+
export const CFN_RESOURCE_LIMIT = 500;
|
|
17
|
+
/** @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html - "Outputs" */
|
|
18
|
+
export const CFN_OUTPUT_LIMIT = 200;
|
|
19
|
+
/** @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html - "Template body size" */
|
|
20
|
+
export const CFN_TEMPLATE_BYTES_LIMIT = 1_048_576; // 1MB
|
|
21
|
+
export const CFN_LIMITS = {
|
|
22
|
+
resources: CFN_RESOURCE_LIMIT,
|
|
23
|
+
outputs: CFN_OUTPUT_LIMIT,
|
|
24
|
+
templateBytes: CFN_TEMPLATE_BYTES_LIMIT,
|
|
25
|
+
};
|
|
26
|
+
/** Warn when usage reaches this fraction of the CloudFormation limit. */
|
|
27
|
+
export const WARNING_THRESHOLD = 0.8; // 80%
|
|
28
|
+
/**
|
|
29
|
+
* Compute statistics for a resolved CloudFormation template.
|
|
30
|
+
*/
|
|
31
|
+
export function computeStats(template, serialized) {
|
|
32
|
+
const resources = template?.Resources ?? {};
|
|
33
|
+
const outputs = template?.Outputs ?? {};
|
|
34
|
+
const json = serialized ?? JSON.stringify(template);
|
|
35
|
+
const templateBytes = Buffer.byteLength(json, 'utf8');
|
|
36
|
+
const resourceTypes = {};
|
|
37
|
+
for (const [, value] of Object.entries(resources)) {
|
|
38
|
+
const type = value?.Type ?? 'Unknown';
|
|
39
|
+
resourceTypes[type] = (resourceTypes[type] ?? 0) + 1;
|
|
40
|
+
}
|
|
41
|
+
const resourceCount = Object.keys(resources).length;
|
|
42
|
+
const outputCount = Object.keys(outputs).length;
|
|
43
|
+
return {
|
|
44
|
+
resourceCount,
|
|
45
|
+
resourceLimit: CFN_LIMITS.resources,
|
|
46
|
+
resourcePercent: round((resourceCount / CFN_LIMITS.resources) * 100),
|
|
47
|
+
outputCount,
|
|
48
|
+
outputLimit: CFN_LIMITS.outputs,
|
|
49
|
+
outputPercent: round((outputCount / CFN_LIMITS.outputs) * 100),
|
|
50
|
+
templateBytes,
|
|
51
|
+
templateLimit: CFN_LIMITS.templateBytes,
|
|
52
|
+
templatePercent: round((templateBytes / CFN_LIMITS.templateBytes) * 100),
|
|
53
|
+
resourceTypes,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check stats against 80% warning thresholds. Returns warnings (if any).
|
|
58
|
+
*/
|
|
59
|
+
export function checkThresholds(stats) {
|
|
60
|
+
const warnings = [];
|
|
61
|
+
const threshold = WARNING_THRESHOLD * 100;
|
|
62
|
+
if (stats.resourcePercent >= threshold) {
|
|
63
|
+
warnings.push({
|
|
64
|
+
message: `Resource count (${stats.resourceCount}/${stats.resourceLimit}) is at ${stats.resourcePercent}% of the CloudFormation limit`,
|
|
65
|
+
current: stats.resourceCount,
|
|
66
|
+
limit: stats.resourceLimit,
|
|
67
|
+
percent: stats.resourcePercent,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (stats.outputPercent >= threshold) {
|
|
71
|
+
warnings.push({
|
|
72
|
+
message: `Output count (${stats.outputCount}/${stats.outputLimit}) is at ${stats.outputPercent}% of the CloudFormation limit`,
|
|
73
|
+
current: stats.outputCount,
|
|
74
|
+
limit: stats.outputLimit,
|
|
75
|
+
percent: stats.outputPercent,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (stats.templatePercent >= threshold) {
|
|
79
|
+
warnings.push({
|
|
80
|
+
message: `Template size (${formatBytes(stats.templateBytes)}/${formatBytes(stats.templateLimit)}) is at ${stats.templatePercent}% of the CloudFormation limit`,
|
|
81
|
+
current: stats.templateBytes,
|
|
82
|
+
limit: stats.templateLimit,
|
|
83
|
+
percent: stats.templatePercent,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return warnings;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Format stats as a human-readable report string.
|
|
90
|
+
*/
|
|
91
|
+
export function formatStatsReport(stats) {
|
|
92
|
+
const lines = [
|
|
93
|
+
'CloudFormation Template Statistics',
|
|
94
|
+
'==================================',
|
|
95
|
+
`Resources: ${stats.resourceCount}/${stats.resourceLimit} (${stats.resourcePercent}%)`,
|
|
96
|
+
`Outputs: ${stats.outputCount}/${stats.outputLimit} (${stats.outputPercent}%)`,
|
|
97
|
+
`Size: ${formatBytes(stats.templateBytes)}/${formatBytes(stats.templateLimit)} (${stats.templatePercent}%)`,
|
|
98
|
+
];
|
|
99
|
+
const types = Object.entries(stats.resourceTypes).sort((a, b) => b[1] - a[1]);
|
|
100
|
+
if (types.length > 0) {
|
|
101
|
+
lines.push('', 'Resource Types:');
|
|
102
|
+
for (const [type, count] of types) {
|
|
103
|
+
lines.push(` ${type}: ${count}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return lines.join('\n');
|
|
107
|
+
}
|
|
108
|
+
function formatBytes(bytes) {
|
|
109
|
+
if (bytes >= 1_048_576)
|
|
110
|
+
return `${(bytes / 1_048_576).toFixed(2)} MB`;
|
|
111
|
+
if (bytes >= 1024)
|
|
112
|
+
return `${(bytes / 1024).toFixed(2)} KB`;
|
|
113
|
+
return `${bytes} B`;
|
|
114
|
+
}
|
|
115
|
+
function round(n) {
|
|
116
|
+
return Math.round(n * 100) / 100;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/lib/stats.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@znemz/cfn-include",
|
|
3
|
-
"version": "4.1
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"description": "Preprocessor for CloudFormation templates with support for loops and flexible include statements",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aws",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"typecheck": "tsc --noEmit"
|
|
58
58
|
},
|
|
59
59
|
"overrides": {
|
|
60
|
-
"fast-xml-parser": "5.3.
|
|
60
|
+
"fast-xml-parser": "5.3.6"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@aws-sdk/client-cloudformation": "^3.637.0",
|