@aws-cdk/toolkit-lib 1.29.1 → 1.30.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.
Files changed (38) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/diagnose/index.d.ts +28 -0
  3. package/lib/actions/diagnose/index.js +1 -1
  4. package/lib/actions/validate/index.d.ts +2 -0
  5. package/lib/actions/validate/index.js +1 -1
  6. package/lib/api/aws-auth/sdk.d.ts +5 -1
  7. package/lib/api/aws-auth/sdk.js +5 -1
  8. package/lib/api/cloud-assembly/environment.js +4 -1
  9. package/lib/api/cloud-assembly/stack-collection.d.ts +2 -0
  10. package/lib/api/cloud-assembly/stack-collection.js +3 -1
  11. package/lib/api/deployments/deploy-stack.js +4 -2
  12. package/lib/api/deployments/deployments.js +3 -1
  13. package/lib/api/diagnosing/diagnosis-formatting.js +54 -13
  14. package/lib/api/diagnosing/format-utils.d.ts +3 -0
  15. package/lib/api/diagnosing/format-utils.js +36 -0
  16. package/lib/api/diagnosing/resource-investigation.d.ts +41 -0
  17. package/lib/api/diagnosing/resource-investigation.js +302 -0
  18. package/lib/api/diagnosing/stack-diagnoser.d.ts +39 -3
  19. package/lib/api/diagnosing/stack-diagnoser.js +71 -30
  20. package/lib/api/io/private/messages.js +2 -2
  21. package/lib/api/validate/validate-formatting.d.ts +9 -2
  22. package/lib/api/validate/validate-formatting.js +117 -69
  23. package/lib/private/tools.js +26 -24
  24. package/lib/toolkit/private/collect-annotation-report.d.ts +12 -0
  25. package/lib/toolkit/private/collect-annotation-report.js +85 -0
  26. package/lib/toolkit/private/validation-report.d.ts +32 -0
  27. package/lib/toolkit/private/validation-report.js +119 -0
  28. package/lib/toolkit/toolkit.d.ts +4 -7
  29. package/lib/toolkit/toolkit.js +24 -67
  30. package/lib/toolkit/types.d.ts +1 -0
  31. package/lib/toolkit/types.js +1 -1
  32. package/lib/util/glob-matcher.d.ts +19 -7
  33. package/lib/util/glob-matcher.js +63 -14
  34. package/package.json +5 -5
  35. package/lib/api/diagnosing/tree-builder.d.ts +0 -13
  36. package/lib/api/diagnosing/tree-builder.js +0 -86
  37. package/lib/api/diagnosing/tree.d.ts +0 -19
  38. package/lib/api/diagnosing/tree.js +0 -72
@@ -2,85 +2,84 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hostMessageFromValidation = hostMessageFromValidation;
4
4
  exports.formatValidateResult = formatValidateResult;
5
+ exports.formatValidationReports = formatValidationReports;
6
+ exports.humanFriendlyFilename = humanFriendlyFilename;
5
7
  const path = require("node:path");
6
8
  const chalk = require("chalk");
7
9
  const private_1 = require("../io/private");
8
- // Matches C0 control chars (except \t and \n), DEL, and CSI (8-bit mode).
9
- // Strips ANSI escape sequences, carriage returns, backspaces, BEL, and
10
- // bidirectional overrides that could spoof terminal output.
11
- const CONTROL_CHARS = /[\x00-\x08\x0B-\x1F\x7F\x9B]/g;
12
- function sanitize(s) {
13
- return (s ?? '').replace(CONTROL_CHARS, '�');
14
- }
15
- const SEVERITY_ORDER = {
16
- fatal: 0,
17
- error: 1,
18
- warning: 2,
19
- info: 3,
20
- };
21
- function hostMessageFromValidation(result) {
10
+ function hostMessageFromValidation(fileRoot, result) {
22
11
  // Always emit at info level so the CLI IoHost doesn't wrap the entire output
23
12
  // in a single color. The formatter handles per-severity coloring internally.
24
13
  // Consumers detect failure via the structured `data.conclusion` field or exit code.
25
- return private_1.IO.CDK_TOOLKIT_I9600.msg(formatValidateResult(result), result);
14
+ return private_1.IO.CDK_TOOLKIT_E9600.msg(formatValidateResult(fileRoot, result), result);
26
15
  }
27
- function formatValidateResult(result) {
28
- const violations = flattenViolations(result.pluginReports);
29
- if (violations.length === 0) {
30
- return '\nPolicy validation passed. No problems found.';
31
- }
16
+ function formatValidateResult(fileRoot, result) {
17
+ return formatValidationReports(fileRoot, result.pluginReports).join('\n\n');
18
+ }
19
+ function formatValidationReports(fileRoot, reports) {
20
+ const successfullyExecutedPlugins = reports.filter((r) => isPluginFailure(r) === undefined);
21
+ const pluginFailures = reports.map(isPluginFailure).filter((e) => e !== undefined);
22
+ const violations = flattenViolations(successfullyExecutedPlugins);
32
23
  violations.sort((a, b) => {
33
24
  const aOrder = SEVERITY_ORDER[a.severity.toLowerCase()] ?? 4;
34
25
  const bOrder = SEVERITY_ORDER[b.severity.toLowerCase()] ?? 4;
35
26
  return aOrder - bOrder;
36
27
  });
37
- const title = result.title ?? 'Validation Report';
38
- const blocks = violations.map((v) => formatViolationBlock(v));
39
- return `\n${title}\n${'-'.repeat(title.length)}\n\n${blocks.join('\n\n')}`;
28
+ return [
29
+ ...pluginFailures.map(formatPluginFailure),
30
+ ...violations.map((v) => formatViolationBlock(fileRoot, v)),
31
+ ];
40
32
  }
41
- function flattenViolations(pluginReports) {
42
- const result = [];
43
- for (const report of pluginReports) {
33
+ function flattenViolations(reports) {
34
+ return reports.flatMap((report) => {
44
35
  const pluginName = report.pluginName;
45
- for (const violation of report.violations) {
46
- const severity = normalizeSeverity(violation.severity);
47
- for (const construct of violation.violatingConstructs) {
48
- result.push({ severity, description: violation.description, ruleName: violation.ruleName, pluginName, construct });
49
- }
50
- }
36
+ return report.violations.flatMap((violation) => {
37
+ return violation.violatingConstructs.map((construct) => ({
38
+ severity: normalizeSeverity(violation.severity),
39
+ description: violation.description,
40
+ ruleName: violation.ruleName,
41
+ pluginName,
42
+ construct,
43
+ suggestedFix: violation.suggestedFix,
44
+ ruleMetadata: violation.ruleMetadata,
45
+ }));
46
+ });
47
+ });
48
+ }
49
+ function normalizeSeverity(severity, customSeverity) {
50
+ switch (severity) {
51
+ case 'fatal':
52
+ case 'error':
53
+ case 'warning':
54
+ case 'info':
55
+ return severity.toUpperCase();
56
+ case 'custom':
57
+ return customSeverity ?? 'INFO';
51
58
  }
52
- return result;
53
- }
54
- function normalizeSeverity(severity) {
55
- if (!severity)
56
- return 'Warning';
57
- const lower = severity.toLowerCase();
58
- if (lower === 'fatal')
59
- return 'Fatal';
60
- if (lower === 'error')
61
- return 'Error';
62
- if (lower === 'warning')
63
- return 'Warning';
64
- if (lower === 'info')
65
- return 'Info';
66
- const safe = sanitize(severity);
67
- return safe.charAt(0).toUpperCase() + safe.slice(1);
68
- }
69
- function formatViolationBlock(v) {
59
+ }
60
+ function formatViolationBlock(fileRoot, v) {
70
61
  const lines = [];
71
- const location = getLeafLocation(v.construct.stackTraces);
62
+ const location = sourceLocation(fileRoot, v.construct.stackTraces);
72
63
  if (location) {
73
64
  lines.push(chalk.underline(sanitize(location)));
74
65
  }
75
- const severityColor = getSeverityColor(v.severity);
76
- const description = stripAckTag(sanitize(v.description));
77
- const severityAndDesc = severityColor(chalk.bold(`${v.severity}: ${description}`));
78
- lines.push(`${severityAndDesc} ${sanitize(v.pluginName)}`);
79
- const constructInfo = formatConstructInfo(v.construct);
66
+ lines.push([
67
+ chalk.bold(getSeverityColor(v.severity)(sanitize(v.severity))),
68
+ chalk.bold(stripAckTag(sanitize(v.description))),
69
+ chalk.grey(`(${sanitize(v.pluginName)})`),
70
+ ].join(' '));
71
+ const constructInfo = formatConstructInfo(fileRoot, v.construct);
80
72
  lines.push(` ${constructInfo}`);
81
- if (v.severity.toLowerCase() !== 'fatal') {
73
+ if (v.suggestedFix) {
74
+ lines.push(` Suggested fix: ${sanitize(v.suggestedFix).replace(/\n/g, '\n ')}`);
75
+ }
76
+ if (isSuppressibleViolation(v)) {
82
77
  const ackId = `${sanitize(v.pluginName)}::${sanitize(v.ruleName)}`.replace(/ /g, '-');
83
- lines.push(` Acknowledge '${ackId}'`);
78
+ lines.push(` ${chalk.grey(`Acknowledge with '${ackId}'`)}`);
79
+ }
80
+ else {
81
+ // If not acknowledgeable, we should still show the rule name for reference.
82
+ lines.push(` ${chalk.grey(`Rule ${sanitize(v.ruleName)}`)}`);
84
83
  }
85
84
  return lines.join('\n');
86
85
  }
@@ -92,29 +91,44 @@ function getSeverityColor(severity) {
92
91
  default: return chalk.blue;
93
92
  }
94
93
  }
95
- function formatConstructInfo(construct) {
94
+ function formatPluginFailure(f) {
95
+ return `${chalk.ansi256(208)('ERROR')} ${sanitize(f.error)}`;
96
+ }
97
+ function formatConstructInfo(fileRoot, construct) {
96
98
  const parts = [];
97
99
  const logicalId = sanitize(construct.cloudFormationResource?.logicalId);
98
100
  if (construct.constructPath) {
99
101
  const cPath = sanitize(construct.constructPath);
100
102
  parts.push(logicalId ? `${chalk.bold(cPath)} (${logicalId})` : chalk.bold(cPath));
101
103
  }
102
- else if (logicalId) {
103
- parts.push(chalk.bold(logicalId));
104
+ else {
105
+ // No construct information, show template path and logical ID
106
+ if (construct.cloudFormationResource?.templatePath) {
107
+ parts.push(humanFriendlyFilename(fileRoot, sanitize(construct.cloudFormationResource.templatePath)));
108
+ }
109
+ if (logicalId) {
110
+ parts.push(chalk.bold(logicalId));
111
+ }
104
112
  }
105
113
  if (construct.constructFqn) {
106
- parts.push(sanitize(construct.constructFqn));
114
+ parts.push(chalk.grey(sanitize(construct.constructFqn)));
107
115
  }
108
116
  return parts.join(' ');
109
117
  }
110
118
  function stripAckTag(description) {
111
119
  return description.replace(/\s*\[ack:\s*[^\]]+\]\s*/g, '').trim();
112
120
  }
113
- function getLeafLocation(stackTraces) {
114
- if (!stackTraces || stackTraces.length === 0)
115
- return undefined;
116
- const lastTrace = stackTraces[stackTraces.length - 1];
117
- const frames = lastTrace.split('\n');
121
+ function sourceLocation(fileRoot, stackTraces) {
122
+ for (const trace of stackTraces ?? []) {
123
+ const frame = getLeafLocation(trace);
124
+ if (frame && frame.fileName) {
125
+ return `${humanFriendlyFilename(fileRoot, frame.fileName)}:${frame.sourceLocation}`;
126
+ }
127
+ }
128
+ return undefined;
129
+ }
130
+ function getLeafLocation(stackTrace) {
131
+ const frames = stackTrace.split('\n');
118
132
  if (frames.length === 0)
119
133
  return undefined;
120
134
  // Find the first frame that's user code (not in node_modules or aws-cdk-lib)
@@ -122,6 +136,40 @@ function getLeafLocation(stackTraces) {
122
136
  const frame = (userFrame ?? frames[0]).trim();
123
137
  const match = frame.match(/\((.+)\)$/) || frame.match(/at\s+(.+)$/);
124
138
  const location = match ? match[1] : frame;
125
- return path.isAbsolute(location.split(':')[0]) ? path.relative(process.cwd(), location) : location;
139
+ return { fileName: location.split(':')[0], sourceLocation: location.split(':').slice(1).join(':') };
140
+ }
141
+ // Matches C0 control chars (except \t and \n), DEL, and CSI (8-bit mode).
142
+ // Strips ANSI escape sequences, carriage returns, backspaces, BEL, and
143
+ // bidirectional overrides that could spoof terminal output.
144
+ const CONTROL_CHARS = /[\x00-\x08\x0B-\x1F\x7F\x9B]/g;
145
+ function sanitize(s) {
146
+ return (s ?? '').replace(CONTROL_CHARS, '�');
147
+ }
148
+ const SEVERITY_ORDER = {
149
+ fatal: 0,
150
+ error: 1,
151
+ warning: 2,
152
+ info: 3,
153
+ };
154
+ function humanFriendlyFilename(root, filename) {
155
+ const absPath = filename;
156
+ const relPath = path.relative(root, filename);
157
+ return relPath.length < absPath.length ? relPath : absPath;
158
+ }
159
+ function isPluginFailure(r) {
160
+ if (r.conclusion === 'success' || r.violations.length > 0 || !r.metadata?.error) {
161
+ return undefined;
162
+ }
163
+ return { error: r.metadata.error };
164
+ }
165
+ /**
166
+ * Report whether it is possible to suppress this violation.
167
+ *
168
+ * Violations that are reported as "fatal", or that have been converted from annotations, cannot be suppressed.
169
+ */
170
+ function isSuppressibleViolation(violation) {
171
+ const isFatal = violation.severity?.toLowerCase() === 'fatal';
172
+ const isErrorAnnotation = violation.ruleMetadata?.['cdk:annotation'] && violation.severity?.toLowerCase() === 'error';
173
+ return !isFatal && !isErrorAnnotation;
126
174
  }
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhbGlkYXRlLWZvcm1hdHRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsOERBS0M7QUFFRCxvREFnQkM7QUFyREQsa0NBQWtDO0FBRWxDLCtCQUErQjtBQUcvQiwyQ0FBbUM7QUFFbkMsMEVBQTBFO0FBQzFFLHVFQUF1RTtBQUN2RSw0REFBNEQ7QUFDNUQsTUFBTSxhQUFhLEdBQUcsK0JBQStCLENBQUM7QUFDdEQsU0FBUyxRQUFRLENBQUMsQ0FBcUI7SUFDckMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFVRCxNQUFNLGNBQWMsR0FBMkI7SUFDN0MsS0FBSyxFQUFFLENBQUM7SUFDUixLQUFLLEVBQUUsQ0FBQztJQUNSLE9BQU8sRUFBRSxDQUFDO0lBQ1YsSUFBSSxFQUFFLENBQUM7Q0FDUixDQUFDO0FBRUYsU0FBZ0IseUJBQXlCLENBQUMsTUFBc0I7SUFDOUQsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSxvRkFBb0Y7SUFDcEYsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxNQUFzQjtJQUN6RCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFM0QsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sZ0RBQWdELENBQUM7SUFDMUQsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkIsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFD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RyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFMUMsNkVBQTZFO0lBQzdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDOUYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFOUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUNyRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5SZXBvcnRKc29uLCBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGVSZXN1bHQgfSBmcm9tICcuLi8uLi9hY3Rpb25zL3ZhbGlkYXRlJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uTGVzc01lc3NhZ2UgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IElPIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbi8vIE1hdGNoZXMgQzAgY29udHJvbCBjaGFycyAoZXhjZXB0IFxcdCBhbmQgXFxuKSwgREVMLCBhbmQgQ1NJICg4LWJpdCBtb2RlKS5cbi8vIFN0cmlwcyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMsIGNhcnJpYWdlIHJldHVybnMsIGJhY2tzcGFjZXMsIEJFTCwgYW5kXG4vLyBiaWRpcmVjdGlvbmFsIG92ZXJyaWRlcyB0aGF0IGNvdWxkIHNwb29mIHRlcm1pbmFsIG91dHB1dC5cbmNvbnN0IENPTlRST0xfQ0hBUlMgPSAvW1xceDAwLVxceDA4XFx4MEItXFx4MUZcXHg3RlxceDlCXS9nO1xuZnVuY3Rpb24gc2FuaXRpemUoczogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIChzID8/ICcnKS5yZXBsYWNlKENPTlRST0xfQ0hBUlMsICfvv70nKTtcbn1cblxuaW50ZXJmYWNlIEZsYXR0ZW5lZFZpb2xhdGlvbiB7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY29uc3RydWN0OiBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uO1xufVxuXG5jb25zdCBTRVZFUklUWV9PUkRFUjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgZmF0YWw6IDAsXG4gIGVycm9yOiAxLFxuICB3YXJuaW5nOiAyLFxuICBpbmZvOiAzLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGhvc3RNZXNzYWdlRnJvbVZhbGlkYXRpb24ocmVzdWx0OiBWYWxpZGF0ZVJlc3VsdCk6IEFjdGlvbkxlc3NNZXNzYWdlPGFueT4ge1xuICAvLyBBbHdheXMgZW1pdCBhdCBpbmZvIGxldmVsIHNvIHRoZSBDTEkgSW9Ib3N0IGRvZXNuJ3Qgd3JhcCB0aGUgZW50aXJlIG91dHB1dFxuICAvLyBpbiBhIHNpbmdsZSBjb2xvci4gVGhlIGZvcm1hdHRlciBoYW5kbGVzIHBlci1zZXZlcml0eSBjb2xvcmluZyBpbnRlcm5hbGx5LlxuICAvLyBDb25zdW1lcnMgZGV0ZWN0IGZhaWx1cmUgdmlhIHRoZSBzdHJ1Y3R1cmVkIGBkYXRhLmNvbmNsdXNpb25gIGZpZWxkIG9yIGV4aXQgY29kZS5cbiAgcmV0dXJuIElPLkNES19UT09MS0lUX0k5NjAwLm1zZyhmb3JtYXRWYWxpZGF0ZVJlc3VsdChyZXN1bHQpLCByZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VmFsaWRhdGVSZXN1bHQocmVzdWx0OiBWYWxpZGF0ZVJlc3VsdCk6IHN0cmluZyB7XG4gIGNvbnN0IHZpb2xhdGlvbnMgPSBmbGF0dGVuVmlvbGF0aW9ucyhyZXN1bHQucGx1Z2luUmVwb3J0cyk7XG5cbiAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdcXG5Qb2xpY3kgdmFsaWRhdGlvbiBwYXNzZWQuIE5vIHByb2JsZW1zIGZvdW5kLic7XG4gIH1cblxuICB2aW9sYXRpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhT3JkZXIgPSBTRVZFUklUWV9PUkRFUlthLnNldmVyaXR5LnRvTG93ZXJDYXNlKCldID8/IDQ7XG4gICAgY29uc3QgYk9yZGVyID0gU0VWRVJJVFlfT1JERVJbYi5zZXZlcml0eS50b0xvd2VyQ2FzZSgpXSA/PyA0O1xuICAgIHJldHVybiBhT3JkZXIgLSBiT3JkZXI7XG4gIH0pO1xuXG4gIGNvbnN0IHRpdGxlID0gcmVzdWx0LnRpdGxlID8/ICdWYWxpZGF0aW9uIFJlcG9ydCc7XG4gIGNvbnN0IGJsb2NrcyA9IHZpb2xhdGlvbnMubWFwKCh2KSA9PiBmb3JtYXRWaW9sYXRpb25CbG9jayh2KSk7XG4gIHJldHVybiBgXFxuJHt0aXRsZX1cXG4keyctJy5yZXBlYXQodGl0bGUubGVuZ3RoKX1cXG5cXG4ke2Jsb2Nrcy5qb2luKCdcXG5cXG4nKX1gO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuVmlvbGF0aW9ucyhwbHVnaW5SZXBvcnRzOiBQbHVnaW5SZXBvcnRKc29uW10pOiBGbGF0dGVuZWRWaW9sYXRpb25bXSB7XG4gIGNvbnN0IHJlc3VsdDogRmxhdHRlbmVkVmlvbGF0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJlcG9ydCBvZiBwbHVnaW5SZXBvcnRzKSB7XG4gICAgY29uc3QgcGx1Z2luTmFtZSA9IHJlcG9ydC5wbHVnaW5OYW1lO1xuXG4gICAgZm9yIChjb25zdCB2aW9sYXRpb24gb2YgcmVwb3J0LnZpb2xhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNldmVyaXR5ID0gbm9ybWFsaXplU2V2ZXJpdHkodmlvbGF0aW9uLnNldmVyaXR5KTtcblxuICAgICAgZm9yIChjb25zdCBjb25zdHJ1Y3Qgb2YgdmlvbGF0aW9uLnZpb2xhdGluZ0NvbnN0cnVjdHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goeyBzZXZlcml0eSwgZGVzY3JpcHRpb246IHZpb2xhdGlvbi5kZXNjcmlwdGlvbiwgcnVsZU5hbWU6IHZpb2xhdGlvbi5ydWxlTmFtZSwgcGx1Z2luTmFtZSwgY29uc3RydWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNldmVyaXR5KHNldmVyaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIXNldmVyaXR5KSByZXR1cm4gJ1dhcm5pbmcnO1xuICBjb25zdCBsb3dlciA9IHNldmVyaXR5LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChsb3dlciA9PT0gJ2ZhdGFsJykgcmV0dXJuICdGYXRhbCc7XG4gIGlmIChsb3dlciA9PT0gJ2Vycm9yJykgcmV0dXJuICdFcnJvcic7XG4gIGlmIChsb3dlciA9PT0gJ3dhcm5pbmcnKSByZXR1cm4gJ1dhcm5pbmcnO1xuICBpZiAobG93ZXIgPT09ICdpbmZvJykgcmV0dXJuICdJbmZvJztcbiAgY29uc3Qgc2FmZSA9IHNhbml0aXplKHNldmVyaXR5KTtcbiAgcmV0dXJuIHNhZmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzYWZlLnNsaWNlKDEpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRWaW9sYXRpb25CbG9jayh2OiBGbGF0dGVuZWRWaW9sYXRpb24pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBsb2NhdGlvbiA9IGdldExlYWZMb2NhdGlvbih2LmNvbnN0cnVjdC5zdGFja1RyYWNlcyk7XG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxpbmVzLnB1c2goY2hhbGsudW5kZXJsaW5lKHNhbml0aXplKGxvY2F0aW9uKSkpO1xuICB9XG5cbiAgY29uc3Qgc2V2ZXJpdHlDb2xvciA9IGdldFNldmVyaXR5Q29sb3Iodi5zZXZlcml0eSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gc3RyaXBBY2tUYWcoc2FuaXRpemUodi5kZXNjcmlwdGlvbikpO1xuICBjb25zdCBzZXZlcml0eUFuZERlc2MgPSBzZXZlcml0eUNvbG9yKGNoYWxrLmJvbGQoYCR7di5zZXZlcml0eX06ICR7ZGVzY3JpcHRpb259YCkpO1xuICBsaW5lcy5wdXNoKGAke3NldmVyaXR5QW5kRGVzY30gJHtzYW5pdGl6ZSh2LnBsdWdpbk5hbWUpfWApO1xuXG4gIGNvbnN0IGNvbnN0cnVjdEluZm8gPSBmb3JtYXRDb25zdHJ1Y3RJbmZvKHYuY29uc3RydWN0KTtcbiAgbGluZXMucHVzaChgICAgJHtjb25zdHJ1Y3RJbmZvfWApO1xuXG4gIGlmICh2LnNldmVyaXR5LnRvTG93ZXJDYXNlKCkgIT09ICdmYXRhbCcpIHtcbiAgICBjb25zdCBhY2tJZCA9IGAke3Nhbml0aXplKHYucGx1Z2luTmFtZSl9Ojoke3Nhbml0aXplKHYucnVsZU5hbWUpfWAucmVwbGFjZSgvIC9nLCAnLScpO1xuICAgIGxpbmVzLnB1c2goYCAgIEFja25vd2xlZGdlICcke2Fja0lkfSdgKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V2ZXJpdHlDb2xvcihzZXZlcml0eTogc3RyaW5nKTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcge1xuICBzd2l0Y2ggKHNldmVyaXR5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdmYXRhbCc6IHJldHVybiBjaGFsay5yZWQ7XG4gICAgY2FzZSAnZXJyb3InOiByZXR1cm4gY2hhbGsuYW5zaTI1NigyMDgpO1xuICAgIGNhc2UgJ3dhcm5pbmcnOiByZXR1cm4gY2hhbGsueWVsbG93O1xuICAgIGRlZmF1bHQ6IHJldHVybiBjaGFsay5ibHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENvbnN0cnVjdEluZm8oY29uc3RydWN0OiBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGxvZ2ljYWxJZCA9IHNhbml0aXplKGNvbnN0cnVjdC5jbG91ZEZvcm1hdGlvblJlc291cmNlPy5sb2dpY2FsSWQpO1xuXG4gIGlmIChjb25zdHJ1Y3QuY29uc3RydWN0UGF0aCkge1xuICAgIGNvbnN0IGNQYXRoID0gc2FuaXRpemUoY29uc3RydWN0LmNvbnN0cnVjdFBhdGgpO1xuICAgIHBhcnRzLnB1c2gobG9naWNhbElkID8gYCR7Y2hhbGsuYm9sZChjUGF0aCl9ICgke2xvZ2ljYWxJZH0pYCA6IGNoYWxrLmJvbGQoY1BhdGgpKTtcbiAgfSBlbHNlIGlmIChsb2dpY2FsSWQpIHtcbiAgICBwYXJ0cy5wdXNoKGNoYWxrLmJvbGQobG9naWNhbElkKSk7XG4gIH1cblxuICBpZiAoY29uc3RydWN0LmNvbnN0cnVjdEZxbikge1xuICAgIHBhcnRzLnB1c2goc2FuaXRpemUoY29uc3RydWN0LmNvbnN0cnVjdEZxbikpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBBY2tUYWcoZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBkZXNjcmlwdGlvbi5yZXBsYWNlKC9cXHMqXFxbYWNrOlxccypbXlxcXV0rXFxdXFxzKi9nLCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFmTG9jYXRpb24oc3RhY2tUcmFjZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzdGFja1RyYWNlcyB8fCBzdGFja1RyYWNlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhc3RUcmFjZSA9IHN0YWNrVHJhY2VzW3N0YWNrVHJhY2VzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBmcmFtZXMgPSBsYXN0VHJhY2Uuc3BsaXQoJ1xcbicpO1xuICBpZiAoZnJhbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBGaW5kIHRoZSBmaXJzdCBmcmFtZSB0aGF0J3MgdXNlciBjb2RlIChub3QgaW4gbm9kZV9tb2R1bGVzIG9yIGF3cy1jZGstbGliKVxuICBjb25zdCB1c2VyRnJhbWUgPSBmcmFtZXMuZmluZChmID0+ICFmLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSAmJiAhZi5pbmNsdWRlcygnYXdzLWNkay1saWInKSk7XG4gIGNvbnN0IGZyYW1lID0gKHVzZXJGcmFtZSA/PyBmcmFtZXNbMF0pLnRyaW0oKTtcblxuICBjb25zdCBtYXRjaCA9IGZyYW1lLm1hdGNoKC9cXCgoLispXFwpJC8pIHx8IGZyYW1lLm1hdGNoKC9hdFxccysoLispJC8pO1xuICBjb25zdCBsb2NhdGlvbiA9IG1hdGNoID8gbWF0Y2hbMV0gOiBmcmFtZTtcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShsb2NhdGlvbi5zcGxpdCgnOicpWzBdKSA/IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbG9jYXRpb24pIDogbG9jYXRpb247XG59XG4iXX0=
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhbGlkYXRlLWZvcm1hdHRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSw4REFLQztBQUVELG9EQUVDO0FBRUQsMERBZ0JDO0FBbUpELHNEQUlDO0FBekxELGtDQUFrQztBQUVsQywrQkFBK0I7QUFHL0IsMkNBQW1DO0FBRW5DLFNBQWdCLHlCQUF5QixDQUFDLFFBQWdCLEVBQUUsTUFBc0I7SUFDaEYsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSxvRkFBb0Y7SUFDcEYsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsUUFBZ0IsRUFBRSxNQUFzQjtJQUMzRSxPQUFPLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxTQUFnQix1QkFBdUIsQ0FBQyxRQUFnQixFQUFFLE9BQTJCO0lBQ25GLE1BQU0sMkJBQTJCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFFbkYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUVsRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FB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QVEsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3RCxDQUFDO0FBTUQsU0FBUyxlQUFlLENBQUMsQ0FBbUI7SUFDMUMsSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2hGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFNBQTBFO0lBQ3pHLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDO0lBQzlELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxPQUFPLENBQUM7SUFDdEgsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblJlcG9ydEpzb24sIFBvbGljeVZpb2xhdGlvbkpzb24sIFBvbGljeVZpb2xhdGlvblNldmVyaXR5LCBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGVSZXN1bHQgfSBmcm9tICcuLi8uLi9hY3Rpb25zL3ZhbGlkYXRlJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uTGVzc01lc3NhZ2UgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IElPIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBob3N0TWVzc2FnZUZyb21WYWxpZGF0aW9uKGZpbGVSb290OiBzdHJpbmcsIHJlc3VsdDogVmFsaWRhdGVSZXN1bHQpOiBBY3Rpb25MZXNzTWVzc2FnZTxhbnk+IHtcbiAgLy8gQWx3YXlzIGVtaXQgYXQgaW5mbyBsZXZlbCBzbyB0aGUgQ0xJIElvSG9zdCBkb2Vzbid0IHdyYXAgdGhlIGVudGlyZSBvdXRwdXRcbiAgLy8gaW4gYSBzaW5nbGUgY29sb3IuIFRoZSBmb3JtYXR0ZXIgaGFuZGxlcyBwZXItc2V2ZXJpdHkgY29sb3JpbmcgaW50ZXJuYWxseS5cbiAgLy8gQ29uc3VtZXJzIGRldGVjdCBmYWlsdXJlIHZpYSB0aGUgc3RydWN0dXJlZCBgZGF0YS5jb25jbHVzaW9uYCBmaWVsZCBvciBleGl0IGNvZGUuXG4gIHJldHVybiBJTy5DREtfVE9PTEtJVF9FOTYwMC5tc2coZm9ybWF0VmFsaWRhdGVSZXN1bHQoZmlsZVJvb3QsIHJlc3VsdCksIHJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWYWxpZGF0ZVJlc3VsdChmaWxlUm9vdDogc3RyaW5nLCByZXN1bHQ6IFZhbGlkYXRlUmVzdWx0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGZvcm1hdFZhbGlkYXRpb25SZXBvcnRzKGZpbGVSb290LCByZXN1bHQucGx1Z2luUmVwb3J0cykuam9pbignXFxuXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWYWxpZGF0aW9uUmVwb3J0cyhmaWxlUm9vdDogc3RyaW5nLCByZXBvcnRzOiBQbHVnaW5SZXBvcnRKc29uW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHN1Y2Nlc3NmdWxseUV4ZWN1dGVkUGx1Z2lucyA9IHJlcG9ydHMuZmlsdGVyKChyKSA9PiBpc1BsdWdpbkZhaWx1cmUocikgPT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHBsdWdpbkZhaWx1cmVzID0gcmVwb3J0cy5tYXAoaXNQbHVnaW5GYWlsdXJlKS5maWx0ZXIoKGUpID0+IGUgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdmlvbGF0aW9ucyA9IGZsYXR0ZW5WaW9sYXRpb25zKHN1Y2Nlc3NmdWxseUV4ZWN1dGVkUGx1Z2lucyk7XG5cbiAgdmlvbGF0aW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYU9yZGVyID0gU0VWRVJJVFlfT1JERVJbYS5zZXZlcml0eS50b0xvd2VyQ2FzZSgpXSA/PyA0O1xuICAgIGNvbnN0IGJPcmRlciA9IFNFVkVSSVRZX09SREVSW2Iuc2V2ZXJpdHkudG9Mb3dlckNhc2UoKV0gPz8gNDtcbiAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xuICB9KTtcblxuICByZXR1cm4gW1xuICAgIC4uLnBsdWdpbkZhaWx1cmVzLm1hcChmb3JtYXRQbHVnaW5GYWlsdXJlKSxcbiAgICAuLi52aW9sYXRpb25zLm1hcCgodikgPT4gZm9ybWF0VmlvbGF0aW9uQmxvY2soZmlsZVJvb3QsIHYpKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlblZpb2xhdGlvbnMocmVwb3J0czogUGx1Z2luUmVwb3J0SnNvbltdKTogRmxhdHRlbmVkVmlvbGF0aW9uW10ge1xuICByZXR1cm4gcmVwb3J0cy5mbGF0TWFwKChyZXBvcnQpID0+IHtcbiAgICBjb25zdCBwbHVnaW5OYW1lID0gcmVwb3J0LnBsdWdpbk5hbWU7XG4gICAgcmV0dXJuIHJlcG9ydC52aW9sYXRpb25zLmZsYXRNYXAoKHZpb2xhdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHZpb2xhdGlvbi52aW9sYXRpbmdDb25zdHJ1Y3RzLm1hcCgoY29uc3RydWN0KSA9PiAoe1xuICAgICAgICBzZXZlcml0eTogbm9ybWFsaXplU2V2ZXJpdHkodmlvbGF0aW9uLnNldmVyaXR5KSxcbiAgICAgICAgZGVzY3JpcHRpb246IHZpb2xhdGlvbi5kZXNjcmlwdGlvbixcbiAgICAgICAgcnVsZU5hbWU6IHZpb2xhdGlvbi5ydWxlTmFtZSxcbiAgICAgICAgcGx1Z2luTmFtZSxcbiAgICAgICAgY29uc3RydWN0LFxuICAgICAgICBzdWdnZXN0ZWRGaXg6IHZpb2xhdGlvbi5zdWdnZXN0ZWRGaXgsXG4gICAgICAgIHJ1bGVNZXRhZGF0YTogdmlvbGF0aW9uLnJ1bGVNZXRhZGF0YSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNldmVyaXR5KHNldmVyaXR5OiBQb2xpY3lWaW9sYXRpb25TZXZlcml0eSwgY3VzdG9tU2V2ZXJpdHk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgY2FzZSAnZmF0YWwnOlxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICBjYXNlICd3YXJuaW5nJzpcbiAgICBjYXNlICdpbmZvJzpcbiAgICAgIHJldHVybiBzZXZlcml0eS50b1VwcGVyQ2FzZSgpO1xuICAgIGNhc2UgJ2N1c3RvbSc6XG4gICAgICByZXR1cm4gY3VzdG9tU2V2ZXJpdHkgPz8gJ0lORk8nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFZpb2xhdGlvbkJsb2NrKGZpbGVSb290OiBzdHJpbmcsIHY6IEZsYXR0ZW5lZFZpb2xhdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gc291cmNlTG9jYXRpb24oZmlsZVJvb3QsIHYuY29uc3RydWN0LnN0YWNrVHJhY2VzKTtcbiAgaWYgKGxvY2F0aW9uKSB7XG4gICAgbGluZXMucHVzaChjaGFsay51bmRlcmxpbmUoc2FuaXRpemUobG9jYXRpb24pKSk7XG4gIH1cblxuICBsaW5lcy5wdXNoKFtcbiAgICBjaGFsay5ib2xkKGdldFNldmVyaXR5Q29sb3Iodi5zZXZlcml0eSkoc2FuaXRpemUodi5zZXZlcml0eSkpKSxcbiAgICBjaGFsay5ib2xkKHN0cmlwQWNrVGFnKHNhbml0aXplKHYuZGVzY3JpcHRpb24pKSksXG4gICAgY2hhbGsuZ3JleShgKCR7c2FuaXRpemUodi5wbHVnaW5OYW1lKX0pYCksXG4gIF0uam9pbignICcpKTtcblxuICBjb25zdCBjb25zdHJ1Y3RJbmZvID0gZm9ybWF0Q29uc3RydWN0SW5mbyhmaWxlUm9vdCwgdi5jb25zdHJ1Y3QpO1xuICBsaW5lcy5wdXNoKGAgICAke2NvbnN0cnVjdEluZm99YCk7XG5cbiAgaWYgKHYuc3VnZ2VzdGVkRml4KSB7XG4gICAgbGluZXMucHVzaChgICAgU3VnZ2VzdGVkIGZpeDogJHtzYW5pdGl6ZSh2LnN1Z2dlc3RlZEZpeCkucmVwbGFjZSgvXFxuL2csICdcXG4gICAnKX1gKTtcbiAgfVxuXG4gIGlmIChpc1N1cHByZXNzaWJsZVZpb2xhdGlvbih2KSkge1xuICAgIGNvbnN0IGFja0lkID0gYCR7c2FuaXRpemUodi5wbHVnaW5OYW1lKX06OiR7c2FuaXRpemUodi5ydWxlTmFtZSl9YC5yZXBsYWNlKC8gL2csICctJyk7XG4gICAgbGluZXMucHVzaChgICAgJHtjaGFsay5ncmV5KGBBY2tub3dsZWRnZSB3aXRoICcke2Fja0lkfSdgKX1gKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBub3QgYWNrbm93bGVkZ2VhYmxlLCB3ZSBzaG91bGQgc3RpbGwgc2hvdyB0aGUgcnVsZSBuYW1lIGZvciByZWZlcmVuY2UuXG4gICAgbGluZXMucHVzaChgICAgJHtjaGFsay5ncmV5KGBSdWxlICR7c2FuaXRpemUodi5ydWxlTmFtZSl9YCl9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldFNldmVyaXR5Q29sb3Ioc2V2ZXJpdHk6IHN0cmluZyk6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nIHtcbiAgc3dpdGNoIChzZXZlcml0eS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnZmF0YWwnOiByZXR1cm4gY2hhbGsucmVkO1xuICAgIGNhc2UgJ2Vycm9yJzogcmV0dXJuIGNoYWxrLmFuc2kyNTYoMjA4KTtcbiAgICBjYXNlICd3YXJuaW5nJzogcmV0dXJuIGNoYWxrLnllbGxvdztcbiAgICBkZWZhdWx0OiByZXR1cm4gY2hhbGsuYmx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRQbHVnaW5GYWlsdXJlKGY6IFBsdWdpbkVycm9yKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NoYWxrLmFuc2kyNTYoMjA4KSgnRVJST1InKX0gJHtzYW5pdGl6ZShmLmVycm9yKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRDb25zdHJ1Y3RJbmZvKGZpbGVSb290OiBzdHJpbmcsIGNvbnN0cnVjdDogVmlvbGF0aW5nQ29uc3RydWN0SnNvbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBsb2dpY2FsSWQgPSBzYW5pdGl6ZShjb25zdHJ1Y3QuY2xvdWRGb3JtYXRpb25SZXNvdXJjZT8ubG9naWNhbElkKTtcblxuICBpZiAoY29uc3RydWN0LmNvbnN0cnVjdFBhdGgpIHtcbiAgICBjb25zdCBjUGF0aCA9IHNhbml0aXplKGNvbnN0cnVjdC5jb25zdHJ1Y3RQYXRoKTtcbiAgICBwYXJ0cy5wdXNoKGxvZ2ljYWxJZCA/IGAke2NoYWxrLmJvbGQoY1BhdGgpfSAoJHtsb2dpY2FsSWR9KWAgOiBjaGFsay5ib2xkKGNQYXRoKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gY29uc3RydWN0IGluZm9ybWF0aW9uLCBzaG93IHRlbXBsYXRlIHBhdGggYW5kIGxvZ2ljYWwgSURcbiAgICBpZiAoY29uc3RydWN0LmNsb3VkRm9ybWF0aW9uUmVzb3VyY2U/LnRlbXBsYXRlUGF0aCkge1xuICAgICAgcGFydHMucHVzaChodW1hbkZyaWVuZGx5RmlsZW5hbWUoZmlsZVJvb3QsIHNhbml0aXplKGNvbnN0cnVjdC5jbG91ZEZvcm1hdGlvblJlc291cmNlLnRlbXBsYXRlUGF0aCkpKTtcbiAgICB9XG4gICAgaWYgKGxvZ2ljYWxJZCkge1xuICAgICAgcGFydHMucHVzaChjaGFsay5ib2xkKGxvZ2ljYWxJZCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25zdHJ1Y3QuY29uc3RydWN0RnFuKSB7XG4gICAgcGFydHMucHVzaChjaGFsay5ncmV5KHNhbml0aXplKGNvbnN0cnVjdC5jb25zdHJ1Y3RGcW4pKSk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBzdHJpcEFja1RhZyhkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlc2NyaXB0aW9uLnJlcGxhY2UoL1xccypcXFthY2s6XFxzKlteXFxdXStcXF1cXHMqL2csICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHNvdXJjZUxvY2F0aW9uKGZpbGVSb290OiBzdHJpbmcsIHN0YWNrVHJhY2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdHJhY2Ugb2Ygc3RhY2tUcmFjZXMgPz8gW10pIHtcbiAgICBjb25zdCBmcmFtZSA9IGdldExlYWZMb2NhdGlvbih0cmFjZSk7XG4gICAgaWYgKGZyYW1lICYmIGZyYW1lLmZpbGVOYW1lKSB7XG4gICAgICByZXR1cm4gYCR7aHVtYW5GcmllbmRseUZpbGVuYW1lKGZpbGVSb290LCBmcmFtZS5maWxlTmFtZSl9OiR7ZnJhbWUuc291cmNlTG9jYXRpb259YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0TGVhZkxvY2F0aW9uKHN0YWNrVHJhY2U6IHN0cmluZykge1xuICBjb25zdCBmcmFtZXMgPSBzdGFja1RyYWNlLnNwbGl0KCdcXG4nKTtcbiAgaWYgKGZyYW1lcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gRmluZCB0aGUgZmlyc3QgZnJhbWUgdGhhdCdzIHVzZXIgY29kZSAobm90IGluIG5vZGVfbW9kdWxlcyBvciBhd3MtY2RrLWxpYilcbiAgY29uc3QgdXNlckZyYW1lID0gZnJhbWVzLmZpbmQoZiA9PiAhZi5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykgJiYgIWYuaW5jbHVkZXMoJ2F3cy1jZGstbGliJykpO1xuICBjb25zdCBmcmFtZSA9ICh1c2VyRnJhbWUgPz8gZnJhbWVzWzBdKS50cmltKCk7XG5cbiAgY29uc3QgbWF0Y2ggPSBmcmFtZS5tYXRjaCgvXFwoKC4rKVxcKSQvKSB8fCBmcmFtZS5tYXRjaCgvYXRcXHMrKC4rKSQvKTtcbiAgY29uc3QgbG9jYXRpb24gPSBtYXRjaCA/IG1hdGNoWzFdIDogZnJhbWU7XG4gIHJldHVybiB7IGZpbGVOYW1lOiBsb2NhdGlvbi5zcGxpdCgnOicpWzBdLCBzb3VyY2VMb2NhdGlvbjogbG9jYXRpb24uc3BsaXQoJzonKS5zbGljZSgxKS5qb2luKCc6JykgfTtcbn1cblxuLy8gTWF0Y2hlcyBDMCBjb250cm9sIGNoYXJzIChleGNlcHQgXFx0IGFuZCBcXG4pLCBERUwsIGFuZCBDU0kgKDgtYml0IG1vZGUpLlxuLy8gU3RyaXBzIEFOU0kgZXNjYXBlIHNlcXVlbmNlcywgY2FycmlhZ2UgcmV0dXJucywgYmFja3NwYWNlcywgQkVMLCBhbmRcbi8vIGJpZGlyZWN0aW9uYWwgb3ZlcnJpZGVzIHRoYXQgY291bGQgc3Bvb2YgdGVybWluYWwgb3V0cHV0LlxuY29uc3QgQ09OVFJPTF9DSEFSUyA9IC9bXFx4MDAtXFx4MDhcXHgwQi1cXHgxRlxceDdGXFx4OUJdL2c7XG5mdW5jdGlvbiBzYW5pdGl6ZShzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gKHMgPz8gJycpLnJlcGxhY2UoQ09OVFJPTF9DSEFSUywgJ++/vScpO1xufVxuXG5leHBvcnQgdHlwZSBGbGF0dGVuZWRWaW9sYXRpb24gPVxuICAmIFBpY2s8UGx1Z2luUmVwb3J0SnNvbiwgJ3BsdWdpbk5hbWUnPlxuICAmIFBpY2s8UG9saWN5VmlvbGF0aW9uSnNvbiwgJ2Rlc2NyaXB0aW9uJyB8ICdydWxlTmFtZScgfCAnc3VnZ2VzdGVkRml4JyB8ICdydWxlTWV0YWRhdGEnPlxuICAmIHsgc2V2ZXJpdHk6IHN0cmluZzsgY29uc3RydWN0OiBWaW9sYXRpbmdDb25zdHJ1Y3RKc29uIH07XG5cbmNvbnN0IFNFVkVSSVRZX09SREVSOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICBmYXRhbDogMCxcbiAgZXJyb3I6IDEsXG4gIHdhcm5pbmc6IDIsXG4gIGluZm86IDMsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5GcmllbmRseUZpbGVuYW1lKHJvb3Q6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGFic1BhdGggPSBmaWxlbmFtZTtcbiAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdCwgZmlsZW5hbWUpO1xuICByZXR1cm4gcmVsUGF0aC5sZW5ndGggPCBhYnNQYXRoLmxlbmd0aCA/IHJlbFBhdGggOiBhYnNQYXRoO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luRXJyb3Ige1xuICByZWFkb25seSBlcnJvcjogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc1BsdWdpbkZhaWx1cmUocjogUGx1Z2luUmVwb3J0SnNvbik6IFBsdWdpbkVycm9yIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHIuY29uY2x1c2lvbiA9PT0gJ3N1Y2Nlc3MnIHx8IHIudmlvbGF0aW9ucy5sZW5ndGggPiAwIHx8ICFyLm1ldGFkYXRhPy5lcnJvcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgZXJyb3I6IHIubWV0YWRhdGEuZXJyb3IgfTtcbn1cblxuLyoqXG4gKiBSZXBvcnQgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBzdXBwcmVzcyB0aGlzIHZpb2xhdGlvbi5cbiAqXG4gKiBWaW9sYXRpb25zIHRoYXQgYXJlIHJlcG9ydGVkIGFzIFwiZmF0YWxcIiwgb3IgdGhhdCBoYXZlIGJlZW4gY29udmVydGVkIGZyb20gYW5ub3RhdGlvbnMsIGNhbm5vdCBiZSBzdXBwcmVzc2VkLlxuICovXG5mdW5jdGlvbiBpc1N1cHByZXNzaWJsZVZpb2xhdGlvbih2aW9sYXRpb246IHsgc2V2ZXJpdHk/OiBzdHJpbmc7IHJ1bGVNZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSk6IGJvb2xlYW4ge1xuICBjb25zdCBpc0ZhdGFsID0gdmlvbGF0aW9uLnNldmVyaXR5Py50b0xvd2VyQ2FzZSgpID09PSAnZmF0YWwnO1xuICBjb25zdCBpc0Vycm9yQW5ub3RhdGlvbiA9IHZpb2xhdGlvbi5ydWxlTWV0YWRhdGE/LlsnY2RrOmFubm90YXRpb24nXSAmJiB2aW9sYXRpb24uc2V2ZXJpdHk/LnRvTG93ZXJDYXNlKCkgPT09ICdlcnJvcic7XG4gIHJldHVybiAhaXNGYXRhbCAmJiAhaXNFcnJvckFubm90YXRpb247XG59XG4iXX0=
@@ -17,9 +17,11 @@ var require_zip = __commonJS({
17
17
  exports2.zipString = zipString;
18
18
  var fs_1 = require("fs");
19
19
  var path = require("path");
20
- var stream_1 = require("stream");
21
20
  var fast_glob_1 = require("fast-glob");
22
- var archiver = require("archiver");
21
+ var yazl_1 = require("yazl");
22
+ function epoch() {
23
+ return new Date(1980, 0, 1, 0, 0, 0);
24
+ }
23
25
  async function zipDirectory(directory, outputFile, eventEmitter = () => {
24
26
  }) {
25
27
  const temporaryOutputFile = `${outputFile}.${randomString()}._tmp`;
@@ -29,20 +31,18 @@ var require_zip = __commonJS({
29
31
  function zipString(fileName, rawString) {
30
32
  return new Promise((resolve, reject) => {
31
33
  const buffers = [];
32
- const converter = new stream_1.Writable();
33
- converter._write = (chunk, _, callback) => {
34
- buffers.push(chunk);
35
- process.nextTick(callback);
36
- };
37
- converter.on("finish", () => resolve(Buffer.concat(buffers)));
38
- const archive = archiver("zip");
39
- archive.on("error", reject);
40
- archive.pipe(converter);
41
- archive.append(rawString, {
42
- name: fileName,
43
- date: /* @__PURE__ */ new Date("1980-01-01T00:00:00.000Z")
34
+ const zip = new yazl_1.ZipFile();
35
+ zip.outputStream.on("data", (chunk) => buffers.push(chunk));
36
+ zip.outputStream.on("error", reject);
37
+ zip.outputStream.on("end", () => resolve(Buffer.concat(buffers)));
38
+ zip.addBuffer(Buffer.from(rawString), fileName, {
39
+ mtime: epoch(),
40
+ // reset date to get the same hash for the same content
41
+ // Only emit the DOS timestamp (no UTC "universal time" extended field),
42
+ // so the archive bytes do not depend on the machine's timezone.
43
+ forceDosTimestamp: true
44
44
  });
45
- void archive.finalize();
45
+ zip.end();
46
46
  });
47
47
  }
48
48
  function writeZipFile(directory, outputFile) {
@@ -54,23 +54,25 @@ var require_zip = __commonJS({
54
54
  cwd: directory
55
55
  };
56
56
  const files = (0, fast_glob_1.globSync)("**", globOptions);
57
+ const zip = new yazl_1.ZipFile();
58
+ zip.outputStream.on("error", fail);
57
59
  const output = (0, fs_1.createWriteStream)(outputFile);
58
- const archive = archiver("zip");
59
- archive.on("warning", fail);
60
- archive.on("error", fail);
60
+ output.on("error", fail);
61
61
  output.once("close", ok);
62
- archive.pipe(output);
62
+ zip.outputStream.pipe(output);
63
63
  for (const file of files) {
64
64
  const fullPath = path.resolve(directory, file);
65
65
  const [data, stat] = await Promise.all([fs_1.promises.readFile(fullPath), fs_1.promises.stat(fullPath)]);
66
- archive.append(data, {
67
- name: file,
68
- date: /* @__PURE__ */ new Date("1980-01-01T00:00:00.000Z"),
66
+ zip.addBuffer(data, file, {
67
+ mtime: epoch(),
69
68
  // reset dates to get the same hash for the same content
70
- mode: stat.mode
69
+ mode: stat.mode,
70
+ // Only emit the DOS timestamp (no UTC "universal time" extended field),
71
+ // so the archive bytes do not depend on the machine's timezone.
72
+ forceDosTimestamp: true
71
73
  });
72
74
  }
73
- await archive.finalize();
75
+ zip.end();
74
76
  });
75
77
  }
76
78
  async function moveIntoPlace(source, target, eventEmitter) {
@@ -0,0 +1,12 @@
1
+ import type * as cxschema from '@aws-cdk/cloud-assembly-schema';
2
+ import type { StackCollection } from '../../api/cloud-assembly/stack-collection';
3
+ /**
4
+ * Collect annotation metadata (warnings and errors) from the construct tree
5
+ * and convert them into a NamedValidationPluginReport that can be merged
6
+ * into the same report pipeline as plugin violations.
7
+ *
8
+ * Effectively the same as what happens here:
9
+ * <https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/core/lib/private/collect-annotation-report.ts>
10
+ */
11
+ export declare function collectAnnotationReport(stacks: StackCollection): cxschema.PluginReportJson;
12
+ //# sourceMappingURL=collect-annotation-report.d.ts.map
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectAnnotationReport = collectAnnotationReport;
4
+ const cxapi = require("@aws-cdk/cloud-assembly-api");
5
+ const ANNOTATION_PLUGIN_NAME = 'Construct Annotations';
6
+ /**
7
+ * Collect annotation metadata (warnings and errors) from the construct tree
8
+ * and convert them into a NamedValidationPluginReport that can be merged
9
+ * into the same report pipeline as plugin violations.
10
+ *
11
+ * Effectively the same as what happens here:
12
+ * <https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/core/lib/private/collect-annotation-report.ts>
13
+ */
14
+ function collectAnnotationReport(stacks) {
15
+ // The return type requires that we combine violations by rule, so we have to group them first here.
16
+ const ruleMap = new Map();
17
+ for (const stack of stacks.stackArtifacts) {
18
+ for (const entry of stack.messages) {
19
+ let severity;
20
+ switch (entry.level) {
21
+ case cxapi.SynthesisMessageLevel.WARNING:
22
+ severity = 'warning';
23
+ break;
24
+ case cxapi.SynthesisMessageLevel.ERROR:
25
+ severity = 'error';
26
+ break;
27
+ case cxapi.SynthesisMessageLevel.INFO:
28
+ severity = 'info';
29
+ break;
30
+ }
31
+ const { message, ruleName } = splitDescriptionAndId(String(entry.entry.data));
32
+ const ruleKey = `${ruleName}|${severity}|${message}`;
33
+ let violation = ruleMap.get(ruleKey);
34
+ if (!violation) {
35
+ violation = {
36
+ ruleName: ruleName ?? `${severity}-annotation`,
37
+ description: message,
38
+ severity,
39
+ violatingConstructs: [],
40
+ ruleMetadata: {
41
+ 'cdk:annotation': 'true',
42
+ },
43
+ };
44
+ ruleMap.set(ruleKey, violation);
45
+ }
46
+ violation.violatingConstructs.push({
47
+ constructPath: entry.id.replace(/^\//, ''), // remove leading slash
48
+ // TODO: see if this information can be obtained from tree.json
49
+ // cloudFormationResource
50
+ // constructFqn:
51
+ // libraryVersion
52
+ // TODO: see if we can get this from metadata stack traces. We may need to re-enable them for
53
+ // annotations in the core library. Otherwise we should probably get a stack trace to the resource itself.
54
+ // stackTraces
55
+ });
56
+ }
57
+ }
58
+ const violations = Array.from(ruleMap.values());
59
+ const hasErrors = violations.some(v => v.severity === 'error');
60
+ return {
61
+ pluginName: ANNOTATION_PLUGIN_NAME,
62
+ conclusion: hasErrors ? 'failure' : 'success',
63
+ violations,
64
+ };
65
+ }
66
+ /**
67
+ * Annotations have IDs in two places:
68
+ *
69
+ * - Warnings have `[ack:<id>]` in the message.
70
+ * - Errors have `(<namespace>::<id>)` in the message.
71
+ *
72
+ * Separate the rule name from the rest of the description.
73
+ */
74
+ function splitDescriptionAndId(message) {
75
+ const ackMatch = message.match(/\[ack: ([^\]]+)\]/);
76
+ if (ackMatch) {
77
+ return { message: message.replace(ackMatch[0], '').trim(), ruleName: ackMatch[1] };
78
+ }
79
+ const idMatch = message.match(/\(([^()]+::[^()]+)\)$/);
80
+ if (idMatch) {
81
+ return { message: message.replace(idMatch[0], '').trim(), ruleName: idMatch[1] };
82
+ }
83
+ return { message };
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdC1hbm5vdGF0aW9uLXJlcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbGxlY3QtYW5ub3RhdGlvbi1yZXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSwwREEwREM7QUF4RUQscURBQXFEO0FBSXJELE1BQU0sc0JBQXNCLEdBQUcsdUJBQXVCLENBQUM7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHVCQUF1QixDQUFDLE1BQXVCO0lBQzdELG9HQUFvRztJQUNwRyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBd0MsQ0FBQztJQUVoRSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLFFBQXNELENBQUM7WUFFM0QsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQU87b0JBQ3RDLFFBQVEsR0FBRyxTQUFTLENBQUM7b0JBQ3JCLE1BQU07Z0JBQ1IsS0FBSyxLQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSztvQkFDcEMsUUFBUSxHQUFHLE9BQU8sQ0FBQztvQkFDbkIsTUFBTTtnQkFDUixLQUFLLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJO29CQUNuQyxRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUNsQixNQUFNO1lBQ1YsQ0FBQztZQUVELE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5RSxNQUFNLE9BQU8sR0FBRyxHQUFHLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDckQsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHO29CQUNWLFFBQVEsRUFBRSxRQUFRLElBQUksR0FBRyxRQUFRLGFBQWE7b0JBQzlDLFdBQVcsRUFBRSxPQUFPO29CQUNwQixRQUFRO29CQUNSLG1CQUFtQixFQUFFLEVBQUU7b0JBQ3ZCLFlBQVksRUFBRTt3QkFDWixnQkFBZ0IsRUFBRSxNQUFNO3FCQUN6QjtpQkFDRixDQUFDO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFFRCxTQUFTLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QjtnQkFFbkUsK0RBQStEO2dCQUMvRCx5QkFBeUI7Z0JBQ3pCLGdCQUFnQjtnQkFDaEIsaUJBQWlCO2dCQUVqQiw2RkFBNkY7Z0JBQzdGLDBHQUEwRztnQkFDMUcsY0FBYzthQUNmLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQztJQUMvRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLHNCQUFzQjtRQUNsQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDN0MsVUFBVTtLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMscUJBQXFCLENBQUMsT0FBZTtJQUM1QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3JGLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdkQsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSAqIGFzIGN4c2NoZW1hIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFN0YWNrQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL2FwaS9jbG91ZC1hc3NlbWJseS9zdGFjay1jb2xsZWN0aW9uJztcblxuY29uc3QgQU5OT1RBVElPTl9QTFVHSU5fTkFNRSA9ICdDb25zdHJ1Y3QgQW5ub3RhdGlvbnMnO1xuXG4vKipcbiAqIENvbGxlY3QgYW5ub3RhdGlvbiBtZXRhZGF0YSAod2FybmluZ3MgYW5kIGVycm9ycykgZnJvbSB0aGUgY29uc3RydWN0IHRyZWVcbiAqIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhIE5hbWVkVmFsaWRhdGlvblBsdWdpblJlcG9ydCB0aGF0IGNhbiBiZSBtZXJnZWRcbiAqIGludG8gdGhlIHNhbWUgcmVwb3J0IHBpcGVsaW5lIGFzIHBsdWdpbiB2aW9sYXRpb25zLlxuICpcbiAqIEVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIHdoYXQgaGFwcGVucyBoZXJlOlxuICogPGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL21haW4vcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvcHJpdmF0ZS9jb2xsZWN0LWFubm90YXRpb24tcmVwb3J0LnRzPlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEFubm90YXRpb25SZXBvcnQoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24pOiBjeHNjaGVtYS5QbHVnaW5SZXBvcnRKc29uIHtcbiAgLy8gVGhlIHJldHVybiB0eXBlIHJlcXVpcmVzIHRoYXQgd2UgY29tYmluZSB2aW9sYXRpb25zIGJ5IHJ1bGUsIHNvIHdlIGhhdmUgdG8gZ3JvdXAgdGhlbSBmaXJzdCBoZXJlLlxuICBjb25zdCBydWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIGN4c2NoZW1hLlBvbGljeVZpb2xhdGlvbkpzb24+KCk7XG5cbiAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3Muc3RhY2tBcnRpZmFjdHMpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHN0YWNrLm1lc3NhZ2VzKSB7XG4gICAgICBsZXQgc2V2ZXJpdHk6IGN4c2NoZW1hLlBvbGljeVZpb2xhdGlvblNldmVyaXR5IHwgdW5kZWZpbmVkO1xuXG4gICAgICBzd2l0Y2ggKGVudHJ5LmxldmVsKSB7XG4gICAgICAgIGNhc2UgY3hhcGkuU3ludGhlc2lzTWVzc2FnZUxldmVsLldBUk5JTkc6XG4gICAgICAgICAgc2V2ZXJpdHkgPSAnd2FybmluZyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgY3hhcGkuU3ludGhlc2lzTWVzc2FnZUxldmVsLkVSUk9SOlxuICAgICAgICAgIHNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjeGFwaS5TeW50aGVzaXNNZXNzYWdlTGV2ZWwuSU5GTzpcbiAgICAgICAgICBzZXZlcml0eSA9ICdpbmZvJztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBtZXNzYWdlLCBydWxlTmFtZSB9ID0gc3BsaXREZXNjcmlwdGlvbkFuZElkKFN0cmluZyhlbnRyeS5lbnRyeS5kYXRhKSk7XG4gICAgICBjb25zdCBydWxlS2V5ID0gYCR7cnVsZU5hbWV9fCR7c2V2ZXJpdHl9fCR7bWVzc2FnZX1gO1xuICAgICAgbGV0IHZpb2xhdGlvbiA9IHJ1bGVNYXAuZ2V0KHJ1bGVLZXkpO1xuICAgICAgaWYgKCF2aW9sYXRpb24pIHtcbiAgICAgICAgdmlvbGF0aW9uID0ge1xuICAgICAgICAgIHJ1bGVOYW1lOiBydWxlTmFtZSA/PyBgJHtzZXZlcml0eX0tYW5ub3RhdGlvbmAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IG1lc3NhZ2UsXG4gICAgICAgICAgc2V2ZXJpdHksXG4gICAgICAgICAgdmlvbGF0aW5nQ29uc3RydWN0czogW10sXG4gICAgICAgICAgcnVsZU1ldGFkYXRhOiB7XG4gICAgICAgICAgICAnY2RrOmFubm90YXRpb24nOiAndHJ1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcnVsZU1hcC5zZXQocnVsZUtleSwgdmlvbGF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdmlvbGF0aW9uLnZpb2xhdGluZ0NvbnN0cnVjdHMucHVzaCh7XG4gICAgICAgIGNvbnN0cnVjdFBhdGg6IGVudHJ5LmlkLnJlcGxhY2UoL15cXC8vLCAnJyksIC8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoXG5cbiAgICAgICAgLy8gVE9ETzogc2VlIGlmIHRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIG9idGFpbmVkIGZyb20gdHJlZS5qc29uXG4gICAgICAgIC8vIGNsb3VkRm9ybWF0aW9uUmVzb3VyY2VcbiAgICAgICAgLy8gY29uc3RydWN0RnFuOlxuICAgICAgICAvLyBsaWJyYXJ5VmVyc2lvblxuXG4gICAgICAgIC8vIFRPRE86IHNlZSBpZiB3ZSBjYW4gZ2V0IHRoaXMgZnJvbSBtZXRhZGF0YSBzdGFjayB0cmFjZXMuIFdlIG1heSBuZWVkIHRvIHJlLWVuYWJsZSB0aGVtIGZvclxuICAgICAgICAvLyBhbm5vdGF0aW9ucyBpbiB0aGUgY29yZSBsaWJyYXJ5LiBPdGhlcndpc2Ugd2Ugc2hvdWxkIHByb2JhYmx5IGdldCBhIHN0YWNrIHRyYWNlIHRvIHRoZSByZXNvdXJjZSBpdHNlbGYuXG4gICAgICAgIC8vIHN0YWNrVHJhY2VzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB2aW9sYXRpb25zID0gQXJyYXkuZnJvbShydWxlTWFwLnZhbHVlcygpKTtcbiAgY29uc3QgaGFzRXJyb3JzID0gdmlvbGF0aW9ucy5zb21lKHYgPT4gdi5zZXZlcml0eSA9PT0gJ2Vycm9yJyk7XG4gIHJldHVybiB7XG4gICAgcGx1Z2luTmFtZTogQU5OT1RBVElPTl9QTFVHSU5fTkFNRSxcbiAgICBjb25jbHVzaW9uOiBoYXNFcnJvcnMgPyAnZmFpbHVyZScgOiAnc3VjY2VzcycsXG4gICAgdmlvbGF0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBBbm5vdGF0aW9ucyBoYXZlIElEcyBpbiB0d28gcGxhY2VzOlxuICpcbiAqIC0gV2FybmluZ3MgaGF2ZSBgW2Fjazo8aWQ+XWAgaW4gdGhlIG1lc3NhZ2UuXG4gKiAtIEVycm9ycyBoYXZlIGAoPG5hbWVzcGFjZT46OjxpZD4pYCBpbiB0aGUgbWVzc2FnZS5cbiAqXG4gKiBTZXBhcmF0ZSB0aGUgcnVsZSBuYW1lIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBzcGxpdERlc2NyaXB0aW9uQW5kSWQobWVzc2FnZTogc3RyaW5nKTogeyBtZXNzYWdlOiBzdHJpbmc7IHJ1bGVOYW1lPzogc3RyaW5nIH0ge1xuICBjb25zdCBhY2tNYXRjaCA9IG1lc3NhZ2UubWF0Y2goL1xcW2FjazogKFteXFxdXSspXFxdLyk7XG4gIGlmIChhY2tNYXRjaCkge1xuICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2UucmVwbGFjZShhY2tNYXRjaFswXSwgJycpLnRyaW0oKSwgcnVsZU5hbWU6IGFja01hdGNoWzFdIH07XG4gIH1cblxuICBjb25zdCBpZE1hdGNoID0gbWVzc2FnZS5tYXRjaCgvXFwoKFteKCldKzo6W14oKV0rKVxcKSQvKTtcbiAgaWYgKGlkTWF0Y2gpIHtcbiAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlLnJlcGxhY2UoaWRNYXRjaFswXSwgJycpLnRyaW0oKSwgcnVsZU5hbWU6IGlkTWF0Y2hbMV0gfTtcbiAgfVxuXG4gIHJldHVybiB7IG1lc3NhZ2UgfTtcbn1cbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import type { PluginReportJson, PolicyValidationReportConclusion } from '@aws-cdk/cloud-assembly-schema';
2
+ import type { StackCollection } from '../../api/cloud-assembly/stack-collection';
3
+ import type { IoHelper } from '../../api/io/private/io-helper';
4
+ import type { MinimumSeverity } from '../types';
5
+ interface AssemblyLike {
6
+ readonly directory: string;
7
+ }
8
+ /**
9
+ * Return a validation report that contains the validation report that the CDK app has written, as well as any Construct Metadata annotations in the manifest.
10
+ *
11
+ * This function takes into account the CDK app can already have written the
12
+ * construct annotations into the validation report, or not, depending on the
13
+ * setting of a deprecated feature flag. If the annotations are already in the report,
14
+ * they are not copied.
15
+ *
16
+ * Afterwards, the list of violations is filtered to only include those that are relevant to the stacks selected for validation.
17
+ *
18
+ * Returns whether an explicit report file was found or not.
19
+ */
20
+ export declare function obtainUnifiedValidationReport(assembly: AssemblyLike, stacks: StackCollection): Promise<PluginReportJson[]>;
21
+ /**
22
+ * Return a success/failure conclusion from the given report
23
+ */
24
+ export declare function combineConclusions(reports: PluginReportJson[]): PolicyValidationReportConclusion;
25
+ /**
26
+ * For operations that are NOT `cdk validate`, read the validation report and produce a failure if validation failed.
27
+ *
28
+ * Validation failed if there are any plugin reports with a failure conclusion, or if there are any warnings and the assembly is in strict mode.
29
+ */
30
+ export declare function throwIfValidationFailures(assembly: AssemblyLike, stacks: StackCollection, failAt: MinimumSeverity, ioHelper: IoHelper): Promise<void>;
31
+ export {};
32
+ //# sourceMappingURL=validation-report.d.ts.map