@aws-cdk/toolkit-lib 1.24.0 → 1.25.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.
Files changed (94) hide show
  1. package/build-info.json +2 -2
  2. package/db.json.gz +0 -0
  3. package/lib/actions/deploy/index.d.ts +15 -1
  4. package/lib/actions/deploy/index.js +1 -1
  5. package/lib/actions/deploy/private/deployment-method.d.ts +5 -9
  6. package/lib/actions/deploy/private/deployment-method.js +8 -1
  7. package/lib/actions/diagnose/index.d.ts +89 -0
  8. package/lib/actions/diagnose/index.js +3 -0
  9. package/lib/actions/diff/private/helpers.js +12 -15
  10. package/lib/actions/index.d.ts +2 -0
  11. package/lib/actions/index.js +3 -1
  12. package/lib/actions/orphan/index.d.ts +18 -0
  13. package/lib/actions/orphan/index.js +3 -0
  14. package/lib/api/aws-auth/sdk.d.ts +2 -1
  15. package/lib/api/aws-auth/sdk.js +2 -1
  16. package/lib/api/bootstrap/bootstrap-environment.js +4 -4
  17. package/lib/api/bootstrap/bootstrap-template.yaml +5 -16
  18. package/lib/api/bootstrap/deploy-bootstrap.js +9 -1
  19. package/lib/api/cloud-assembly/stack-selector.d.ts +1 -1
  20. package/lib/api/cloud-assembly/stack-selector.js +1 -1
  21. package/lib/api/cloudformation/index.d.ts +1 -0
  22. package/lib/api/cloudformation/index.js +2 -1
  23. package/lib/api/cloudformation/logical-id-map.d.ts +24 -0
  24. package/lib/api/cloudformation/logical-id-map.js +45 -0
  25. package/lib/api/cloudformation/stack-helpers.d.ts +6 -0
  26. package/lib/api/cloudformation/stack-helpers.js +12 -1
  27. package/lib/api/deployments/cfn-api.d.ts +8 -17
  28. package/lib/api/deployments/cfn-api.js +60 -71
  29. package/lib/api/deployments/deploy-stack.d.ts +6 -2
  30. package/lib/api/deployments/deploy-stack.js +43 -61
  31. package/lib/api/deployments/deployments.d.ts +3 -2
  32. package/lib/api/deployments/deployments.js +31 -7
  33. package/lib/api/diagnosing/changeset-error-fetcher.d.ts +51 -0
  34. package/lib/api/diagnosing/changeset-error-fetcher.js +83 -0
  35. package/lib/api/diagnosing/diagnosis-formatting.d.ts +13 -0
  36. package/lib/api/diagnosing/diagnosis-formatting.js +140 -0
  37. package/lib/api/diagnosing/stack-diagnoser.d.ts +106 -0
  38. package/lib/api/diagnosing/stack-diagnoser.js +354 -0
  39. package/lib/api/diagnosing/tree-builder.d.ts +13 -0
  40. package/lib/api/diagnosing/tree-builder.js +86 -0
  41. package/lib/api/diagnosing/tree.d.ts +19 -0
  42. package/lib/api/diagnosing/tree.js +72 -0
  43. package/lib/api/diff/diff-formatter.js +8 -12
  44. package/lib/api/drift/drift-formatter.d.ts +0 -1
  45. package/lib/api/drift/drift-formatter.js +3 -10
  46. package/lib/api/hotswap/hotswap-deployments.js +14 -2
  47. package/lib/api/hotswap/hotswap-template-cache.d.ts +19 -0
  48. package/lib/api/hotswap/hotswap-template-cache.js +96 -0
  49. package/lib/api/index.d.ts +1 -0
  50. package/lib/api/index.js +2 -1
  51. package/lib/api/io/private/messages.d.ts +5 -0
  52. package/lib/api/io/private/messages.js +23 -1
  53. package/lib/api/io/toolkit-action.d.ts +1 -1
  54. package/lib/api/io/toolkit-action.js +1 -1
  55. package/lib/api/orphan/orphaner.d.ts +75 -0
  56. package/lib/api/orphan/orphaner.js +246 -0
  57. package/lib/api/orphan/private/helpers.d.ts +56 -0
  58. package/lib/api/orphan/private/helpers.js +219 -0
  59. package/lib/api/orphan/private/index.d.ts +2 -0
  60. package/lib/api/orphan/private/index.js +18 -0
  61. package/lib/api/resource-import/importer.d.ts +5 -1
  62. package/lib/api/resource-import/importer.js +26 -6
  63. package/lib/api/settings.d.ts +3 -1
  64. package/lib/api/settings.js +16 -3
  65. package/lib/api/source-tracing/index.d.ts +2 -0
  66. package/lib/api/source-tracing/index.js +18 -0
  67. package/lib/api/source-tracing/private/source-tracing.d.ts +16 -0
  68. package/lib/api/source-tracing/private/source-tracing.js +8 -0
  69. package/lib/api/source-tracing/private/stack-source-tracing.d.ts +32 -0
  70. package/lib/api/source-tracing/private/stack-source-tracing.js +134 -0
  71. package/lib/api/source-tracing/types.d.ts +9 -0
  72. package/lib/api/source-tracing/types.js +3 -0
  73. package/lib/api/stack-events/resource-errors.d.ts +82 -0
  74. package/lib/api/stack-events/resource-errors.js +129 -0
  75. package/lib/api/stack-events/stack-activity-monitor.d.ts +2 -29
  76. package/lib/api/stack-events/stack-activity-monitor.js +6 -95
  77. package/lib/api/stack-events/stack-event-poller.d.ts +71 -8
  78. package/lib/api/stack-events/stack-event-poller.js +107 -13
  79. package/lib/api/stack-events/stack-progress-monitor.d.ts +2 -2
  80. package/lib/api/stack-events/stack-progress-monitor.js +8 -2
  81. package/lib/api/work-graph/work-graph.d.ts +4 -0
  82. package/lib/api/work-graph/work-graph.js +6 -1
  83. package/lib/index.d.ts +1 -0
  84. package/lib/index.js +2 -1
  85. package/lib/index_bg.wasm +0 -0
  86. package/lib/toolkit/toolkit.d.ts +17 -1
  87. package/lib/toolkit/toolkit.js +194 -57
  88. package/lib/util/arrays.d.ts +1 -0
  89. package/lib/util/arrays.js +23 -1
  90. package/lib/util/type-brands.d.ts +1 -1
  91. package/lib/util/type-brands.js +1 -1
  92. package/package.json +13 -13
  93. package/lib/api/deployments/early-validation.d.ts +0 -19
  94. package/lib/api/deployments/early-validation.js +0 -57
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hostMessageFromDiagnosis = hostMessageFromDiagnosis;
4
+ exports.throwDeploymentErrorFromDiagnosis = throwDeploymentErrorFromDiagnosis;
5
+ const tree_builder_1 = require("./tree-builder");
6
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
7
+ const util_1 = require("../../util");
8
+ const private_1 = require("../io/private");
9
+ /**
10
+ * Turn the given stack diagnosis result into an IO message, with default message formatting
11
+ *
12
+ * The default message formatting is what the CLI will print.
13
+ */
14
+ function hostMessageFromDiagnosis(stack) {
15
+ const diagnosis = stack.result;
16
+ switch (diagnosis.type) {
17
+ case 'no-problem':
18
+ return private_1.IO.CDK_TOOLKIT_I9500.msg(formatNoProblemStack(stack, diagnosis), stack);
19
+ case 'problem':
20
+ return private_1.IO.CDK_TOOLKIT_E9500.msg(formatProblemStack(stack, diagnosis), stack);
21
+ case 'error-diagnosing':
22
+ return private_1.IO.CDK_TOOLKIT_W9501.msg(formatDiagnosisErrorStack(stack, diagnosis), stack);
23
+ }
24
+ }
25
+ /**
26
+ * Turn the given diagnosis into a DeploymentError
27
+ */
28
+ function throwDeploymentErrorFromDiagnosis(diag) {
29
+ switch (diag.type) {
30
+ case 'no-problem':
31
+ throw new toolkit_error_1.ToolkitError('DeploymentErrorNotError', 'Diagnosis should represent an error, but does not');
32
+ case 'error-diagnosing':
33
+ throw new toolkit_error_1.DeploymentError(diag.message, 'ErrorDiagnosisFailed');
34
+ }
35
+ // Guaranteed 'type=problem' here
36
+ const errorCode = diag.problems[0]?.errorCode;
37
+ let defaultErrorCode;
38
+ switch (diag.detectedBy.type) {
39
+ case 'change-set':
40
+ defaultErrorCode = 'ChangeSetCreationFailed';
41
+ break;
42
+ case 'early-validation':
43
+ defaultErrorCode = 'EarlyValidationFailure';
44
+ break;
45
+ case 'deployment':
46
+ defaultErrorCode = 'StackDeployFailed';
47
+ break;
48
+ }
49
+ throw new toolkit_error_1.DeploymentError(formatProblemDiagnosis(diag), errorCode ?? defaultErrorCode);
50
+ }
51
+ function formatProblemDiagnosis(diag) {
52
+ switch (diag.detectedBy.type) {
53
+ case 'change-set':
54
+ return formatChangeSetProblems(diag.problems, diag.detectedBy);
55
+ case 'early-validation':
56
+ return formatEarlyValidationProblems(diag.problems, diag.detectedBy);
57
+ case 'deployment':
58
+ return formatDeploymentProblems(diag.problems, diag.detectedBy);
59
+ }
60
+ }
61
+ function formatChangeSetProblems(problems, detectedBy) {
62
+ const caption = `Failed to create change set ${detectedBy.changeSetName}`;
63
+ if (problems.length > 0) {
64
+ return `${caption}:\n${formatResourceErrors(problems)}`;
65
+ }
66
+ else {
67
+ return `${caption}: ${detectedBy.statusReason}`;
68
+ }
69
+ }
70
+ function formatEarlyValidationProblems(problems, detectedBy) {
71
+ const caption = `Early validation failed for change set ${detectedBy.changeSetName}`;
72
+ if (problems.length > 0) {
73
+ return `${caption}:\n${formatResourceErrors(problems)}`;
74
+ }
75
+ else {
76
+ return caption;
77
+ }
78
+ }
79
+ function formatDeploymentProblems(problems, detectedBy) {
80
+ const caption = 'Resource updates failed';
81
+ if (problems.length > 0) {
82
+ return `${caption}:\n${formatResourceErrors(problems)}`;
83
+ }
84
+ else {
85
+ return `${caption} (${detectedBy.stackStatus}): ${detectedBy.statusReason}`;
86
+ }
87
+ }
88
+ function formatNoProblemStack(stack, _m) {
89
+ // TODO: print stack by construct path, not name
90
+ return `✅ Stack ${stack.stackName}: no issues found.`;
91
+ }
92
+ function formatProblemStack(stack, m) {
93
+ // TODO: print stack by construct path, not name
94
+ return `❌ Stack ${stack.stackName}:\n${formatProblemDiagnosis(m)}`;
95
+ }
96
+ function formatDiagnosisErrorStack(stack, m) {
97
+ // TODO: print stack by construct path, not name
98
+ return `⚠️ Could not diagnose stack ${stack.stackName}: ${m.message}`;
99
+ }
100
+ function formatResourceErrors(es) {
101
+ (0, util_1.sortByKey)(es, (e) => [locateResourceError(e)]);
102
+ const b = new tree_builder_1.TreeBuilder('');
103
+ for (const e of es) {
104
+ const p = locateResourceError(e);
105
+ const lastPart = p.split('/').slice(-1)[0];
106
+ const nodeText = b.nodeText(p);
107
+ nodeText.header = [`${lastPart} ${addendum(' ', e.resourceType, e.logicalId)}`.trim()];
108
+ nodeText.body.push(...(0, tree_builder_1.sideBySide)(['🛑'], ' ', (0, tree_builder_1.wrapText)(120, e.message)));
109
+ nodeText.footer = e.sourceTrace?.creationStackTrace
110
+ ? (0, tree_builder_1.sideBySide)(['Source Location:'], ' ', e.sourceTrace?.creationStackTrace)
111
+ : [];
112
+ }
113
+ return b.render();
114
+ }
115
+ /**
116
+ * Return a /-separated construct path for the given error, or try to build as close a represention as possible if we don't have a construct path
117
+ *
118
+ * The root will be the "app"
119
+ */
120
+ function locateResourceError(e) {
121
+ if (e.sourceTrace?.constructPath) {
122
+ return e.sourceTrace?.constructPath;
123
+ }
124
+ const nestedStackParts = e.parentStackLogicalIds.map((l) => `Nested stack ${l}`);
125
+ if (e.logicalId) {
126
+ return [e.topLevelStackHierarchicalId, ...nestedStackParts, e.logicalId].join('/');
127
+ }
128
+ // No logical ID means we are targeting the stack itself
129
+ return [e.topLevelStackHierarchicalId, nestedStackParts].join('/');
130
+ }
131
+ function addendum(sep, ...xs) {
132
+ xs = xs.filter(x => x && typeof x === 'string');
133
+ if (xs.length > 0) {
134
+ return `(${xs.join(sep)})`;
135
+ }
136
+ else {
137
+ return '';
138
+ }
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc2lzLWZvcm1hdHRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWFnbm9zaXMtZm9ybWF0dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDREQWFDO0FBS0QsOEVBMkJDO0FBekRELGlEQUFtRTtBQUVuRSwrREFBNEU7QUFDNUUscUNBQXVDO0FBRXZDLDJDQUFtQztBQUVuQzs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBcUI7SUFDNUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUUvQixRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWpGLEtBQUssU0FBUztZQUNaLE9BQU8sWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsSUFBb0I7SUFDcEUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxJQUFJLDRCQUFZLENBQUMseUJBQXlCLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUV6RyxLQUFLLGtCQUFrQjtZQUNyQixNQUFNLElBQUksK0JBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENB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Q2xCLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2lkZUJ5U2lkZSwgVHJlZUJ1aWxkZXIsIHdyYXBUZXh0IH0gZnJvbSAnLi90cmVlLWJ1aWxkZXInO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zZWRTdGFjaywgU3RhY2tEaWFnbm9zaXMsIFN0YWNrUHJvYmxlbVNvdXJjZSwgVHJhY2VkUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGlhZ25vc2UnO1xuaW1wb3J0IHsgRGVwbG95bWVudEVycm9yLCBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgc29ydEJ5S2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbkxlc3NNZXNzYWdlIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBJTyB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuXG4vKipcbiAqIFR1cm4gdGhlIGdpdmVuIHN0YWNrIGRpYWdub3NpcyByZXN1bHQgaW50byBhbiBJTyBtZXNzYWdlLCB3aXRoIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXR0aW5nXG4gKlxuICogVGhlIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXR0aW5nIGlzIHdoYXQgdGhlIENMSSB3aWxsIHByaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9zdE1lc3NhZ2VGcm9tRGlhZ25vc2lzKHN0YWNrOiBEaWFnbm9zZWRTdGFjayk6IEFjdGlvbkxlc3NNZXNzYWdlPGFueT4ge1xuICBjb25zdCBkaWFnbm9zaXMgPSBzdGFjay5yZXN1bHQ7XG5cbiAgc3dpdGNoIChkaWFnbm9zaXMudHlwZSkge1xuICAgIGNhc2UgJ25vLXByb2JsZW0nOlxuICAgICAgcmV0dXJuIElPLkNES19UT09MS0lUX0k5NTAwLm1zZyhmb3JtYXROb1Byb2JsZW1TdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuXG4gICAgY2FzZSAncHJvYmxlbSc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfRTk1MDAubXNnKGZvcm1hdFByb2JsZW1TdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuXG4gICAgY2FzZSAnZXJyb3ItZGlhZ25vc2luZyc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfVzk1MDEubXNnKGZvcm1hdERpYWdub3Npc0Vycm9yU3RhY2soc3RhY2ssIGRpYWdub3NpcyksIHN0YWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIFR1cm4gdGhlIGdpdmVuIGRpYWdub3NpcyBpbnRvIGEgRGVwbG95bWVudEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0RlcGxveW1lbnRFcnJvckZyb21EaWFnbm9zaXMoZGlhZzogU3RhY2tEaWFnbm9zaXMpOiBuZXZlciB7XG4gIHN3aXRjaCAoZGlhZy50eXBlKSB7XG4gICAgY2FzZSAnbm8tcHJvYmxlbSc6XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZXBsb3ltZW50RXJyb3JOb3RFcnJvcicsICdEaWFnbm9zaXMgc2hvdWxkIHJlcHJlc2VudCBhbiBlcnJvciwgYnV0IGRvZXMgbm90Jyk7XG5cbiAgICBjYXNlICdlcnJvci1kaWFnbm9zaW5nJzpcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoZGlhZy5tZXNzYWdlLCAnRXJyb3JEaWFnbm9zaXNGYWlsZWQnKTtcbiAgfVxuICAvLyBHdWFyYW50ZWVkICd0eXBlPXByb2JsZW0nIGhlcmVcblxuICBjb25zdCBlcnJvckNvZGUgPSBkaWFnLnByb2JsZW1zWzBdPy5lcnJvckNvZGU7XG4gIGxldCBkZWZhdWx0RXJyb3JDb2RlO1xuICBzd2l0Y2ggKGRpYWcuZGV0ZWN0ZWRCeS50eXBlKSB7XG4gICAgY2FzZSAnY2hhbmdlLXNldCc6XG4gICAgICBkZWZhdWx0RXJyb3JDb2RlID0gJ0NoYW5nZVNldENyZWF0aW9uRmFpbGVkJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZWFybHktdmFsaWRhdGlvbic6XG4gICAgICBkZWZhdWx0RXJyb3JDb2RlID0gJ0Vhcmx5VmFsaWRhdGlvbkZhaWx1cmUnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXBsb3ltZW50JzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnU3RhY2tEZXBsb3lGYWlsZWQnO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKGZvcm1hdFByb2JsZW1EaWFnbm9zaXMoZGlhZyksIGVycm9yQ29kZSA/PyBkZWZhdWx0RXJyb3JDb2RlKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJvYmxlbURpYWdub3NpcyhkaWFnOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdwcm9ibGVtJyB9Pik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZGlhZy5kZXRlY3RlZEJ5LnR5cGUpIHtcbiAgICBjYXNlICdjaGFuZ2Utc2V0JzpcbiAgICAgIHJldHVybiBmb3JtYXRDaGFuZ2VTZXRQcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuXG4gICAgY2FzZSAnZWFybHktdmFsaWRhdGlvbic6XG4gICAgICByZXR1cm4gZm9ybWF0RWFybHlWYWxpZGF0aW9uUHJvYmxlbXMoZGlhZy5wcm9ibGVtcywgZGlhZy5kZXRlY3RlZEJ5KTtcblxuICAgIGNhc2UgJ2RlcGxveW1lbnQnOlxuICAgICAgcmV0dXJuIGZvcm1hdERlcGxveW1lbnRQcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENoYW5nZVNldFByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdjaGFuZ2Utc2V0JyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSBgRmFpbGVkIHRvIGNyZWF0ZSBjaGFuZ2Ugc2V0ICR7ZGV0ZWN0ZWRCeS5jaGFuZ2VTZXROYW1lfWA7XG5cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06ICR7ZGV0ZWN0ZWRCeS5zdGF0dXNSZWFzb259YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRFYXJseVZhbGlkYXRpb25Qcm9ibGVtcyhwcm9ibGVtczogVHJhY2VkUmVzb3VyY2VFcnJvcltdLCBkZXRlY3RlZEJ5OiBFeHRyYWN0PFN0YWNrUHJvYmxlbVNvdXJjZSwgeyB0eXBlOiAnZWFybHktdmFsaWRhdGlvbicgfT4pOiBzdHJpbmcge1xuICBjb25zdCBjYXB0aW9uID0gYEVhcmx5IHZhbGlkYXRpb24gZmFpbGVkIGZvciBjaGFuZ2Ugc2V0ICR7ZGV0ZWN0ZWRCeS5jaGFuZ2VTZXROYW1lfWA7XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259OlxcbiR7Zm9ybWF0UmVzb3VyY2VFcnJvcnMocHJvYmxlbXMpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RGVwbG95bWVudFByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdkZXBsb3ltZW50JyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSAnUmVzb3VyY2UgdXBkYXRlcyBmYWlsZWQnO1xuXG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259OlxcbiR7Zm9ybWF0UmVzb3VyY2VFcnJvcnMocHJvYmxlbXMpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259ICgke2RldGVjdGVkQnkuc3RhY2tTdGF0dXN9KTogJHtkZXRlY3RlZEJ5LnN0YXR1c1JlYXNvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE5vUHJvYmxlbVN0YWNrKHN0YWNrOiBEaWFnbm9zZWRTdGFjaywgX206IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ25vLXByb2JsZW0nIH0+KSB7XG4gIC8vIFRPRE86IHByaW50IHN0YWNrIGJ5IGNvbnN0cnVjdCBwYXRoLCBub3QgbmFtZVxuICByZXR1cm4gYOKchSBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX06IG5vIGlzc3VlcyBmb3VuZC5gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9ibGVtU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBtOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdwcm9ibGVtJyB9Pikge1xuICAvLyBUT0RPOiBwcmludCBzdGFjayBieSBjb25zdHJ1Y3QgcGF0aCwgbm90IG5hbWVcbiAgcmV0dXJuIGDinYwgU3RhY2sgJHtzdGFjay5zdGFja05hbWV9OlxcbiR7Zm9ybWF0UHJvYmxlbURpYWdub3NpcyhtKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREaWFnbm9zaXNFcnJvclN0YWNrKHN0YWNrOiBEaWFnbm9zZWRTdGFjaywgbTogRXh0cmFjdDxTdGFja0RpYWdub3NpcywgeyB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycgfT4pIHtcbiAgLy8gVE9ETzogcHJpbnQgc3RhY2sgYnkgY29uc3RydWN0IHBhdGgsIG5vdCBuYW1lXG4gIHJldHVybiBg4pqg77iPIENvdWxkIG5vdCBkaWFnbm9zZSBzdGFjayAke3N0YWNrLnN0YWNrTmFtZX06ICR7bS5tZXNzYWdlfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlc291cmNlRXJyb3JzKGVzOiBUcmFjZWRSZXNvdXJjZUVycm9yW10pIHtcbiAgc29ydEJ5S2V5KGVzLCAoZSkgPT4gW2xvY2F0ZVJlc291cmNlRXJyb3IoZSldKTtcblxuICBjb25zdCBiID0gbmV3IFRyZWVCdWlsZGVyKCcnKTtcbiAgZm9yIChjb25zdCBlIG9mIGVzKSB7XG4gICAgY29uc3QgcCA9IGxvY2F0ZVJlc291cmNlRXJyb3IoZSk7XG4gICAgY29uc3QgbGFzdFBhcnQgPSBwLnNwbGl0KCcvJykuc2xpY2UoLTEpWzBdO1xuXG4gICAgY29uc3Qgbm9kZVRleHQgPSBiLm5vZGVUZXh0KHApO1xuICAgIG5vZGVUZXh0LmhlYWRlciA9IFtgJHtsYXN0UGFydH0gICR7YWRkZW5kdW0oJyAnLCBlLnJlc291cmNlVHlwZSwgZS5sb2dpY2FsSWQpfWAudHJpbSgpXTtcbiAgICBub2RlVGV4dC5ib2R5LnB1c2goLi4uc2lkZUJ5U2lkZShbJ/Cfm5EnXSwgJyAnLCB3cmFwVGV4dCgxMjAsIGUubWVzc2FnZSkpKTtcbiAgICBub2RlVGV4dC5mb290ZXIgPSBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2VcbiAgICAgID8gc2lkZUJ5U2lkZShbJ1NvdXJjZSBMb2NhdGlvbjonXSwgJyAnLCBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2UpXG4gICAgICA6IFtdO1xuICB9XG4gIHJldHVybiBiLnJlbmRlcigpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIC8tc2VwYXJhdGVkIGNvbnN0cnVjdCBwYXRoIGZvciB0aGUgZ2l2ZW4gZXJyb3IsIG9yIHRyeSB0byBidWlsZCBhcyBjbG9zZSBhIHJlcHJlc2VudGlvbiBhcyBwb3NzaWJsZSBpZiB3ZSBkb24ndCBoYXZlIGEgY29uc3RydWN0IHBhdGhcbiAqXG4gKiBUaGUgcm9vdCB3aWxsIGJlIHRoZSBcImFwcFwiXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZVJlc291cmNlRXJyb3IoZTogVHJhY2VkUmVzb3VyY2VFcnJvcik6IHN0cmluZyB7XG4gIGlmIChlLnNvdXJjZVRyYWNlPy5jb25zdHJ1Y3RQYXRoKSB7XG4gICAgcmV0dXJuIGUuc291cmNlVHJhY2U/LmNvbnN0cnVjdFBhdGg7XG4gIH1cblxuICBjb25zdCBuZXN0ZWRTdGFja1BhcnRzID0gZS5wYXJlbnRTdGFja0xvZ2ljYWxJZHMubWFwKChsKSA9PiBgTmVzdGVkIHN0YWNrICR7bH1gKTtcbiAgaWYgKGUubG9naWNhbElkKSB7XG4gICAgcmV0dXJuIFtlLnRvcExldmVsU3RhY2tIaWVyYXJjaGljYWxJZCwgLi4ubmVzdGVkU3RhY2tQYXJ0cywgZS5sb2dpY2FsSWRdLmpvaW4oJy8nKTtcbiAgfVxuICAvLyBObyBsb2dpY2FsIElEIG1lYW5zIHdlIGFyZSB0YXJnZXRpbmcgdGhlIHN0YWNrIGl0c2VsZlxuICByZXR1cm4gW2UudG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkLCBuZXN0ZWRTdGFja1BhcnRzXS5qb2luKCcvJyk7XG59XG5cbmZ1bmN0aW9uIGFkZGVuZHVtKHNlcDogc3RyaW5nLCAuLi54czogQXJyYXk8c3RyaW5nIHwgdW5kZWZpbmVkPik6IHN0cmluZyB7XG4gIHhzID0geHMuZmlsdGVyKHggPT4geCAmJiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICBpZiAoeHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgKCR7eHMuam9pbihzZXApfSlgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuIl19
@@ -0,0 +1,106 @@
1
+ import type { ChangeSetSummary, Stack } from '@aws-sdk/client-cloudformation';
2
+ import type { StackDiagnosis } from '../../actions/diagnose';
3
+ import type { SDK } from '../aws-auth/sdk';
4
+ import type { EnvironmentResources } from '../environment';
5
+ import type { IoHelper } from '../io/private/io-helper';
6
+ import type { ISourceTracer } from '../source-tracing/private/source-tracing';
7
+ import type { ResourceErrors } from '../stack-events/resource-errors';
8
+ export interface CloudFormationStackDiagnoserProps {
9
+ readonly sdk: SDK;
10
+ readonly envResources?: EnvironmentResources;
11
+ readonly sourceTracer: ISourceTracer;
12
+ readonly ioHelper: IoHelper;
13
+ readonly topLevelStackHierarchicalId: string;
14
+ }
15
+ /**
16
+ * Diagnose a stack's failed state
17
+ *
18
+ * - First, determine the stack's state.
19
+ * - If it is in a failed state, we started a deployment that failed. Describe the stack
20
+ * events, and try to determine the root cause from that.
21
+ * - If it is in a normal state, see if there are any failed change sets. Either
22
+ * get the failure message from the change set, or get the failure events from
23
+ * the change set (early validation).
24
+ *
25
+ * This class works at the CloudFormation level, and does not deal with tracing
26
+ * CloudFormation errors to construct code sources yet.
27
+ */
28
+ export declare class CloudFormationStackDiagnoser {
29
+ private readonly props;
30
+ private readonly cfn;
31
+ private parentStackLogicalIds;
32
+ constructor(props: CloudFormationStackDiagnoserProps);
33
+ /**
34
+ * Diagnose a stack's root cause given no pre-existing state
35
+ */
36
+ diagnoseFromFresh(stackName: string): Promise<StackDiagnosis>;
37
+ /**
38
+ * Diagnose potential problems with the change set
39
+ */
40
+ diagnoseChangeSet(changeSet: ChangeSetSummary): Promise<StackDiagnosis>;
41
+ /**
42
+ * Diagnose potential problems with the change set
43
+ */
44
+ diagnoseFromErrorCollection(errors: ResourceErrors, stack: Stack): Promise<StackDiagnosis>;
45
+ /**
46
+ * Diagnose a deployment failure via stack events
47
+ *
48
+ * This is the same logic that the deployment monitor uses.
49
+ */
50
+ private _diagnoseViaStackEvents;
51
+ private _diagnoseChangeSetFailureFromStackName;
52
+ /**
53
+ * Try to diagnose the reason that caused a changeset to fail to create
54
+ *
55
+ * There are a couple of different reasons this can happen, and we go through each of them in order.
56
+ *
57
+ * Usually this starts from trying to detect an error message pattern in the change set status reason,
58
+ * and then potentially going to fetch additional information using additional API calls.
59
+ */
60
+ private _diagnoseChangeSetFailure;
61
+ /**
62
+ * Try to read the resource-specific reasons for a changeset failure from `DescribeEvents`.
63
+ *
64
+ * If we couldn't read the events or there are 0 errors returned by that API, return a generic
65
+ * error.
66
+ */
67
+ private _reportChangeSetFailureFromEvents;
68
+ private addErrorTraces;
69
+ private addErrorTrace;
70
+ /**
71
+ * Build a generic stack error from the given change set information
72
+ *
73
+ * We can't point to a specific resource.
74
+ */
75
+ private _nonSpecificChangeSetError;
76
+ /**
77
+ * Look for nested change sets that have failed, and diagnose those.
78
+ */
79
+ private _diagnoseNestedChangeSetFailure;
80
+ private _findFailedNestedStack;
81
+ /**
82
+ * Try to parse failed auto-imports out from a change set status
83
+ *
84
+ * The pattern looks like this:
85
+ *
86
+ * ```
87
+ * CloudFormation is attempting to import some resources because they already exist in your account. The resources must have the DeletionPolicy attribute set to 'Retain' or 'RetainExceptOnCreate' in the template for successful import. The affected resources are SomeBucketD5B70704 ({BucketName=zomaareenbucket})
88
+ * ```
89
+ *
90
+ * Followed by
91
+ *
92
+ * ```
93
+ * LogicalID ({Prop=Value,Prop=Value}), LogicalID ({Prop=Value}), ...
94
+ * ```
95
+ */
96
+ private _tryDetectFailedAutoImport;
97
+ }
98
+ /**
99
+ * Return true if the given change set has no changes
100
+ *
101
+ * This must be determined from the status, not the 'Changes' array on the
102
+ * object; the latter can be empty because no resources were changed, but if
103
+ * there are changes to Outputs, the change set can still be executed.
104
+ */
105
+ export declare function changeSetHasNoChanges(description: ChangeSetSummary): boolean;
106
+ //# sourceMappingURL=stack-diagnoser.d.ts.map