@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,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceOrphaner = void 0;
4
+ const private_1 = require("./private");
5
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
+ /**
7
+ * Orphans all resources under construct path(s) from a CloudFormation stack.
8
+ *
9
+ * Usage:
10
+ * const plan = await orphaner.makePlan(stack, constructPaths);
11
+ * // inspect plan.orphanedResources
12
+ * const result = await plan.execute();
13
+ */
14
+ class ResourceOrphaner {
15
+ deployments;
16
+ ioHelper;
17
+ roleArn;
18
+ toolkitStackName;
19
+ constructor(props) {
20
+ this.deployments = props.deployments;
21
+ this.ioHelper = props.ioHelper;
22
+ this.roleArn = props.roleArn;
23
+ this.toolkitStackName = props.toolkitStackName;
24
+ }
25
+ /**
26
+ * Analyze the stack and build a plan of what will be orphaned.
27
+ * This is read-only — no changes are made until `plan.execute()` is called.
28
+ */
29
+ async makePlan(stack, constructPaths) {
30
+ const currentTemplate = await this.deployments.readCurrentTemplate(stack);
31
+ const resources = currentTemplate.Resources ?? {};
32
+ // Build a map of construct path -> logical ID from the local assembly
33
+ const pathToLogicalId = new Map();
34
+ for (const md of stack.findMetadataByType('aws:cdk:logicalId')) {
35
+ pathToLogicalId.set(md.path, md.data);
36
+ }
37
+ // Find logical IDs matching the given construct paths (prefix match)
38
+ const matched = [];
39
+ for (const constructPath of constructPaths) {
40
+ const prefix = `/${stack.hierarchicalId}/${constructPath}/`;
41
+ for (const [path, logicalId] of pathToLogicalId) {
42
+ if (path.startsWith(prefix) && resources[logicalId]) {
43
+ matched.push({ logicalId, path });
44
+ }
45
+ }
46
+ }
47
+ if (matched.length === 0) {
48
+ throw new toolkit_error_1.ToolkitError('OrphanNoResources', `No resources found under construct path '${constructPaths.join(', ')}' in stack '${stack.stackName}'`);
49
+ }
50
+ const logicalIds = matched.map(m => m.logicalId);
51
+ const orphanedResources = matched.map(m => ({
52
+ logicalId: m.logicalId,
53
+ resourceType: resources[m.logicalId].Type ?? 'Unknown',
54
+ cdkPath: m.path,
55
+ }));
56
+ return {
57
+ stackName: stack.stackName,
58
+ orphanedResources,
59
+ execute: () => this.execute(stack, logicalIds, currentTemplate),
60
+ };
61
+ }
62
+ async execute(stack, logicalIds, currentTemplate) {
63
+ const env = await this.deployments.envs.accessStackForReadOnlyStackOperations(stack);
64
+ const cfn = env.sdk.cloudFormation();
65
+ // Get physical resource IDs (Ref values)
66
+ const stackResources = await cfn.listStackResources({ StackName: stack.stackName });
67
+ const physicalIds = new Map();
68
+ for (const res of stackResources) {
69
+ if (res.LogicalResourceId && res.PhysicalResourceId) {
70
+ physicalIds.set(res.LogicalResourceId, res.PhysicalResourceId);
71
+ }
72
+ }
73
+ // Step 1/3: Resolve GetAtt attribute values via temporary stack outputs
74
+ await this.ioHelper.defaults.info('Step 1/3: Resolving attribute values...');
75
+ const resolvedValues = await this.resolveGetAttValues(stack, cfn, logicalIds, currentTemplate, physicalIds);
76
+ // Step 2/3: Decouple — set RETAIN, replace all Ref/GetAtt with literals, remove DependsOn
77
+ await this.ioHelper.defaults.info('Step 2/3: Decoupling resources...');
78
+ const decoupledTemplate = JSON.parse(JSON.stringify(currentTemplate));
79
+ for (const id of logicalIds) {
80
+ (0, private_1.replaceReferences)(decoupledTemplate, id, resolvedValues.get(id));
81
+ (0, private_1.removeDependsOn)(decoupledTemplate, id);
82
+ decoupledTemplate.Resources[id].DeletionPolicy = 'Retain';
83
+ decoupledTemplate.Resources[id].UpdateReplacePolicy = 'Retain';
84
+ }
85
+ const step2Result = await this.deployStack(stack, decoupledTemplate, 'cdk-orphan-step2');
86
+ (0, private_1.assertDeploySucceeded)(step2Result, 'Step 2');
87
+ // Step 3/3: Remove orphaned resources from the template
88
+ await this.ioHelper.defaults.info('Step 3/3: Removing resources from stack...');
89
+ const removalTemplate = JSON.parse(JSON.stringify(decoupledTemplate));
90
+ for (const id of logicalIds) {
91
+ delete removalTemplate.Resources[id];
92
+ }
93
+ (0, private_1.ensureNonEmptyResources)(removalTemplate);
94
+ const step3Result = await this.deployStack(stack, removalTemplate, 'cdk-orphan-step3');
95
+ (0, private_1.assertDeploySucceeded)(step3Result, 'Step 3');
96
+ if (step3Result.noOp) {
97
+ throw new toolkit_error_1.ToolkitError('OrphanNoOp', 'Orphan step 3 was unexpectedly a no-op — the resources were not removed from the stack. ' +
98
+ 'If this issue persists, please open an issue at https://github.com/aws/aws-cdk-cli/issues ' +
99
+ 'with your stack template attached.');
100
+ }
101
+ const resourceMapping = await this.getResourceIdentifiers(stack, logicalIds, physicalIds, currentTemplate);
102
+ return { resourceMapping };
103
+ }
104
+ /**
105
+ * Deploy a template override to the stack.
106
+ */
107
+ async deployStack(stack, template, changeSetName) {
108
+ return this.deployments.deployStack({
109
+ stack,
110
+ roleArn: this.roleArn,
111
+ toolkitStackName: this.toolkitStackName,
112
+ deploymentMethod: { method: 'change-set', changeSetName },
113
+ overrideTemplate: template,
114
+ usePreviousParameters: true,
115
+ forceDeployment: true,
116
+ });
117
+ }
118
+ /**
119
+ * Resolve GetAtt attribute values for orphaned resources.
120
+ *
121
+ * Current strategy: inject temporary Outputs into the stack that reference
122
+ * each GetAtt, deploy, then read the resolved values from DescribeStacks.
123
+ *
124
+ * This function is intentionally decoupled from the rest of the orphan flow
125
+ * so it can be replaced with a Cloud Control API-based approach later.
126
+ *
127
+ * Returns a complete map of resolved values (Ref + attrs) for each logical ID.
128
+ */
129
+ async resolveGetAttValues(stack, cfn, logicalIds, currentTemplate, physicalIds) {
130
+ // Build Ref values from physical IDs
131
+ const values = new Map();
132
+ for (const id of logicalIds) {
133
+ const physicalId = physicalIds.get(id);
134
+ if (!physicalId) {
135
+ throw new toolkit_error_1.ToolkitError('OrphanMissingPhysicalId', `Could not resolve physical resource ID for '${id}'`);
136
+ }
137
+ values.set(id, { ref: physicalId, attrs: {} });
138
+ }
139
+ const getAttRefs = this.findGetAttReferences(currentTemplate, logicalIds);
140
+ // If there are no GetAtt references, skip the deploy
141
+ if (getAttRefs.size === 0) {
142
+ return values;
143
+ }
144
+ // Inject temporary outputs so CloudFormation resolves the GetAtt values
145
+ const resolveTemplate = JSON.parse(JSON.stringify(currentTemplate));
146
+ if (!resolveTemplate.Outputs) {
147
+ resolveTemplate.Outputs = {};
148
+ }
149
+ for (const [outputKey, ref] of getAttRefs) {
150
+ resolveTemplate.Outputs[outputKey] = {
151
+ Value: { 'Fn::GetAtt': [ref.logicalId, ref.attr] },
152
+ };
153
+ }
154
+ const step1Result = await this.deployStack(stack, resolveTemplate, 'cdk-orphan-step1');
155
+ (0, private_1.assertDeploySucceeded)(step1Result, 'Step 1');
156
+ // Read resolved values from stack outputs
157
+ const stackDesc = await cfn.describeStacks({ StackName: stack.stackName });
158
+ for (const output of stackDesc.Stacks?.[0]?.Outputs ?? []) {
159
+ if (!output.OutputKey || !output.OutputValue)
160
+ continue;
161
+ const ref = getAttRefs.get(output.OutputKey);
162
+ if (ref) {
163
+ values.get(ref.logicalId).attrs[ref.attr] = output.OutputValue;
164
+ }
165
+ }
166
+ return values;
167
+ }
168
+ findGetAttReferences(template, logicalIds) {
169
+ const refs = new Map();
170
+ const addRef = (id, attr) => {
171
+ const outputKey = `CdkOrphan${id}${attr}`.replace(/[^a-zA-Z0-9]/g, '');
172
+ if (!refs.has(outputKey)) {
173
+ refs.set(outputKey, { logicalId: id, attr });
174
+ }
175
+ };
176
+ const scanSubString = (str) => {
177
+ // Match ${LogicalId.Attr} patterns in Fn::Sub format strings
178
+ const pattern = /\$\{([^}.]+)\.([^}]+)\}/g;
179
+ let match;
180
+ while ((match = pattern.exec(str)) !== null) {
181
+ const [, id, attr] = match;
182
+ if (logicalIds.includes(id)) {
183
+ addRef(id, attr);
184
+ }
185
+ }
186
+ };
187
+ (0, private_1.walkObject)(template, (value) => {
188
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
189
+ // Explicit Fn::GetAtt
190
+ const getAtt = value['Fn::GetAtt'];
191
+ if (Array.isArray(getAtt) && logicalIds.includes(getAtt[0])) {
192
+ addRef(getAtt[0], getAtt[1]);
193
+ }
194
+ // Implicit GetAtt inside Fn::Sub
195
+ const sub = value['Fn::Sub'];
196
+ if (typeof sub === 'string') {
197
+ scanSubString(sub);
198
+ }
199
+ else if (Array.isArray(sub) && typeof sub[0] === 'string') {
200
+ scanSubString(sub[0]);
201
+ }
202
+ }
203
+ });
204
+ return refs;
205
+ }
206
+ async getResourceIdentifiers(stack, logicalIds, physicalIds, template) {
207
+ const result = {};
208
+ try {
209
+ const summaries = await this.deployments.resourceIdentifierSummaries(stack);
210
+ const identifiersByType = new Map();
211
+ for (const summary of summaries) {
212
+ if (summary.ResourceType && summary.ResourceIdentifiers) {
213
+ identifiersByType.set(summary.ResourceType, summary.ResourceIdentifiers);
214
+ }
215
+ }
216
+ const resources = template.Resources ?? {};
217
+ for (const id of logicalIds) {
218
+ const resource = resources[id];
219
+ if (!resource)
220
+ continue;
221
+ const identifierProps = identifiersByType.get(resource.Type);
222
+ if (!identifierProps || identifierProps.length === 0)
223
+ continue;
224
+ const identifier = {};
225
+ const props = resource.Properties ?? {};
226
+ for (const prop of identifierProps) {
227
+ if (props[prop] && typeof props[prop] === 'string') {
228
+ identifier[prop] = props[prop];
229
+ }
230
+ else if (identifierProps.length === 1 && physicalIds.has(id)) {
231
+ identifier[prop] = physicalIds.get(id);
232
+ }
233
+ }
234
+ if (Object.keys(identifier).length > 0) {
235
+ result[id] = identifier;
236
+ }
237
+ }
238
+ }
239
+ catch (e) {
240
+ await this.ioHelper.defaults.warn(`Could not retrieve resource identifiers for import: ${e.message}`);
241
+ }
242
+ return result;
243
+ }
244
+ }
245
+ exports.ResourceOrphaner = ResourceOrphaner;
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JwaGFuZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJvcnBoYW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1Q0FNbUI7QUFDbkIsK0RBQTJEO0FBOEMzRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxnQkFBZ0I7SUFDVixXQUFXLENBQWM7SUFDekIsUUFBUSxDQUFXO0lBQ25CLE9BQU8sQ0FBVTtJQUNqQixnQkFBZ0IsQ0FBVTtJQUUzQyxZQUFZLEtBQTRCO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBd0MsRUFBRSxjQUF3QjtRQUN0RixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUUsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFFbEQsc0VBQXNFO1FBQ3RFLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ2xELEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLG1CQUEwQixDQUFDLEVBQUUsQ0FBQztZQUN0RSxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQWMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxxRUFBcUU7UUFDckUsTUFBTSxPQUFPLEdBQTBDLEVBQUUsQ0FBQztRQUMxRCxLQUFLLE1BQU0sYUFBYSxJQUFJLGNB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QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztnQkFFeEMsS0FBSyxNQUFNLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ25ELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pDLENBQUM7eUJBQU0sSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7d0JBQy9ELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBRSxDQUFDO29CQUMxQyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHVEQUF3RCxDQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBdlJELDRDQXVSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB7XG4gIHJlcGxhY2VSZWZlcmVuY2VzLFxuICByZW1vdmVEZXBlbmRzT24sXG4gIHdhbGtPYmplY3QsXG4gIGFzc2VydERlcGxveVN1Y2NlZWRlZCxcbiAgZW5zdXJlTm9uRW1wdHlSZXNvdXJjZXMsXG59IGZyb20gJy4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICcuLi9hd3MtYXV0aC9zZGsnO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3ltZW50cyB9IGZyb20gJy4uL2RlcGxveW1lbnRzJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcblxuaW50ZXJmYWNlIFJlc29sdmVkVmFsdWVzIHtcbiAgcmVmOiBzdHJpbmc7XG4gIGF0dHJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlT3JwaGFuZXJQcm9wcyB7XG4gIHJlYWRvbmx5IGRlcGxveW1lbnRzOiBEZXBsb3ltZW50cztcbiAgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzb3VyY2UgdGhhdCB3aWxsIGJlIG9ycGhhbmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ycGhhbmVkUmVzb3VyY2Uge1xuICByZWFkb25seSBsb2dpY2FsSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNka1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBsYW5uaW5nIGFuIG9ycGhhbiBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JwaGFuUGxhbiB7XG4gIC8qKiBUaGUgc3RhY2sgYmVpbmcgbW9kaWZpZWQgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIC8qKiBSZXNvdXJjZXMgdGhhdCB3aWxsIGJlIGRldGFjaGVkIGZyb20gdGhlIHN0YWNrICovXG4gIHJlYWRvbmx5IG9ycGhhbmVkUmVzb3VyY2VzOiBPcnBoYW5lZFJlc291cmNlW107XG4gIC8qKiBFeGVjdXRlIHRoZSBvcnBoYW4gb3BlcmF0aW9uICgzIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnRzKSAqL1xuICBleGVjdXRlKCk6IFByb21pc2U8T3JwaGFuUmVzdWx0Pjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGV4ZWN1dGluZyBhbiBvcnBoYW4gb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ycGhhblJlc3VsdCB7XG4gIC8qKiBSZXNvdXJjZSBtYXBwaW5nIEpTT04gZm9yIHVzZSB3aXRoIGBjZGsgaW1wb3J0IC0tcmVzb3VyY2UtbWFwcGluZ2AgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VNYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn1cblxuLyoqXG4gKiBPcnBoYW5zIGFsbCByZXNvdXJjZXMgdW5kZXIgY29uc3RydWN0IHBhdGgocykgZnJvbSBhIENsb3VkRm9ybWF0aW9uIHN0YWNrLlxuICpcbiAqIFVzYWdlOlxuICogICBjb25zdCBwbGFuID0gYXdhaXQgb3JwaGFuZXIubWFrZVBsYW4oc3RhY2ssIGNvbnN0cnVjdFBhdGhzKTtcbiAqICAgLy8gaW5zcGVjdCBwbGFuLm9ycGhhbmVkUmVzb3VyY2VzXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYW4uZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VPcnBoYW5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudHM6IERlcGxveW1lbnRzO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJlc291cmNlT3JwaGFuZXJQcm9wcykge1xuICAgIHRoaXMuZGVwbG95bWVudHMgPSBwcm9wcy5kZXBsb3ltZW50cztcbiAgICB0aGlzLmlvSGVscGVyID0gcHJvcHMuaW9IZWxwZXI7XG4gICAgdGhpcy5yb2xlQXJuID0gcHJvcHMucm9sZUFybjtcbiAgICB0aGlzLnRvb2xraXRTdGFja05hbWUgPSBwcm9wcy50b29sa2l0U3RhY2tOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuYWx5emUgdGhlIHN0YWNrIGFuZCBidWlsZCBhIHBsYW4gb2Ygd2hhdCB3aWxsIGJlIG9ycGhhbmVkLlxuICAgKiBUaGlzIGlzIHJlYWQtb25seSDigJQgbm8gY2hhbmdlcyBhcmUgbWFkZSB1bnRpbCBgcGxhbi5leGVjdXRlKClgIGlzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlUGxhbihzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBjb25zdHJ1Y3RQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPE9ycGhhblBsYW4+IHtcbiAgICBjb25zdCBjdXJyZW50VGVtcGxhdGUgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzLnJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2spO1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGN1cnJlbnRUZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge307XG5cbiAgICAvLyBCdWlsZCBhIG1hcCBvZiBjb25zdHJ1Y3QgcGF0aCAtPiBsb2dpY2FsIElEIGZyb20gdGhlIGxvY2FsIGFzc2VtYmx5XG4gICAgY29uc3QgcGF0aFRvTG9naWNhbElkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG1kIG9mIHN0YWNrLmZpbmRNZXRhZGF0YUJ5VHlwZSgnYXdzOmNkazpsb2dpY2FsSWQnIGFzIGFueSkpIHtcbiAgICAgIHBhdGhUb0xvZ2ljYWxJZC5zZXQobWQucGF0aCwgbWQuZGF0YSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgbG9naWNhbCBJRHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGNvbnN0cnVjdCBwYXRocyAocHJlZml4IG1hdGNoKVxuICAgIGNvbnN0IG1hdGNoZWQ6IHsgbG9naWNhbElkOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnN0cnVjdFBhdGggb2YgY29uc3RydWN0UGF0aHMpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IGAvJHtzdGFjay5oaWVyYXJjaGljYWxJZH0vJHtjb25zdHJ1Y3RQYXRofS9gO1xuICAgICAgZm9yIChjb25zdCBbcGF0aCwgbG9naWNhbElkXSBvZiBwYXRoVG9Mb2dpY2FsSWQpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChwcmVmaXgpICYmIHJlc291cmNlc1tsb2dpY2FsSWRdKSB7XG4gICAgICAgICAgbWF0Y2hlZC5wdXNoKHsgbG9naWNhbElkLCBwYXRoIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdPcnBoYW5Ob1Jlc291cmNlcycsIGBObyByZXNvdXJjZXMgZm91bmQgdW5kZXIgY29uc3RydWN0IHBhdGggJyR7Y29uc3RydWN0UGF0aHMuam9pbignLCAnKX0nIGluIHN0YWNrICcke3N0YWNrLnN0YWNrTmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9naWNhbElkcyA9IG1hdGNoZWQubWFwKG0gPT4gbS5sb2dpY2FsSWQpO1xuICAgIGNvbnN0IG9ycGhhbmVkUmVzb3VyY2VzOiBPcnBoYW5lZFJlc291cmNlW10gPSBtYXRjaGVkLm1hcChtID0+ICh7XG4gICAgICBsb2dpY2FsSWQ6IG0ubG9naWNhbElkLFxuICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZXNbbS5sb2dpY2FsSWRdLlR5cGUgPz8gJ1Vua25vd24nLFxuICAgICAgY2RrUGF0aDogbS5wYXRoLFxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgIG9ycGhhbmVkUmVzb3VyY2VzLFxuICAgICAgZXhlY3V0ZTogKCkgPT4gdGhpcy5leGVjdXRlKHN0YWNrLCBsb2dpY2FsSWRzLCBjdXJyZW50VGVtcGxhdGUpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGUoXG4gICAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICBsb2dpY2FsSWRzOiBzdHJpbmdbXSxcbiAgICBjdXJyZW50VGVtcGxhdGU6IGFueSxcbiAgKTogUHJvbWlzZTxPcnBoYW5SZXN1bHQ+IHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzLmVudnMuYWNjZXNzU3RhY2tGb3JSZWFkT25seVN0YWNrT3BlcmF0aW9ucyhzdGFjayk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gICAgLy8gR2V0IHBoeXNpY2FsIHJlc291cmNlIElEcyAoUmVmIHZhbHVlcylcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IGNmbi5saXN0U3RhY2tSZXNvdXJjZXMoeyBTdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSB9KTtcbiAgICBjb25zdCBwaHlzaWNhbElkcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByZXMgb2Ygc3RhY2tSZXNvdXJjZXMpIHtcbiAgICAgIGlmIChyZXMuTG9naWNhbFJlc291cmNlSWQgJiYgcmVzLlBoeXNpY2FsUmVzb3VyY2VJZCkge1xuICAgICAgICBwaHlzaWNhbElkcy5zZXQocmVzLkxvZ2ljYWxSZXNvdXJjZUlkLCByZXMuUGh5c2ljYWxSZXNvdXJjZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDEvMzogUmVzb2x2ZSBHZXRBdHQgYXR0cmlidXRlIHZhbHVlcyB2aWEgdGVtcG9yYXJ5IHN0YWNrIG91dHB1dHNcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1N0ZXAgMS8zOiBSZXNvbHZpbmcgYXR0cmlidXRlIHZhbHVlcy4uLicpO1xuICAgIGNvbnN0IHJlc29sdmVkVmFsdWVzID0gYXdhaXQgdGhpcy5yZXNvbHZlR2V0QXR0VmFsdWVzKHN0YWNrLCBjZm4sIGxvZ2ljYWxJZHMsIGN1cnJlbnRUZW1wbGF0ZSwgcGh5c2ljYWxJZHMpO1xuXG4gICAgLy8gU3RlcCAyLzM6IERlY291cGxlIOKAlCBzZXQgUkVUQUlOLCByZXBsYWNlIGFsbCBSZWYvR2V0QXR0IHdpdGggbGl0ZXJhbHMsIHJlbW92ZSBEZXBlbmRzT25cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1N0ZXAgMi8zOiBEZWNvdXBsaW5nIHJlc291cmNlcy4uLicpO1xuICAgIGNvbnN0IGRlY291cGxlZFRlbXBsYXRlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjdXJyZW50VGVtcGxhdGUpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGxvZ2ljYWxJZHMpIHtcbiAgICAgIHJlcGxhY2VSZWZlcmVuY2VzKGRlY291cGxlZFRlbXBsYXRlLCBpZCwgcmVzb2x2ZWRWYWx1ZXMuZ2V0KGlkKSEpO1xuICAgICAgcmVtb3ZlRGVwZW5kc09uKGRlY291cGxlZFRlbXBsYXRlLCBpZCk7XG4gICAgICBkZWNvdXBsZWRUZW1wbGF0ZS5SZXNvdXJjZXNbaWRdLkRlbGV0aW9uUG9saWN5ID0gJ1JldGFpbic7XG4gICAgICBkZWNvdXBsZWRUZW1wbGF0ZS5SZXNvdXJjZXNbaWRdLlVwZGF0ZVJlcGxhY2VQb2xpY3kgPSAnUmV0YWluJztcbiAgICB9XG4gICAgY29uc3Qgc3RlcDJSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveVN0YWNrKHN0YWNrLCBkZWNvdXBsZWRUZW1wbGF0ZSwgJ2Nkay1vcnBoYW4tc3RlcDInKTtcbiAgICBhc3NlcnREZXBsb3lTdWNjZWVkZWQoc3RlcDJSZXN1bHQsICdTdGVwIDInKTtcblxuICAgIC8vIFN0ZXAgMy8zOiBSZW1vdmUgb3JwaGFuZWQgcmVzb3VyY2VzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdTdGVwIDMvMzogUmVtb3ZpbmcgcmVzb3VyY2VzIGZyb20gc3RhY2suLi4nKTtcbiAgICBjb25zdCByZW1vdmFsVGVtcGxhdGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlY291cGxlZFRlbXBsYXRlKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBsb2dpY2FsSWRzKSB7XG4gICAgICBkZWxldGUgcmVtb3ZhbFRlbXBsYXRlLlJlc291cmNlc1tpZF07XG4gICAgfVxuICAgIGVuc3VyZU5vbkVtcHR5UmVzb3VyY2VzKHJlbW92YWxUZW1wbGF0ZSk7XG4gICAgY29uc3Qgc3RlcDNSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveVN0YWNrKHN0YWNrLCByZW1vdmFsVGVtcGxhdGUsICdjZGstb3JwaGFuLXN0ZXAzJyk7XG4gICAgYXNzZXJ0RGVwbG95U3VjY2VlZGVkKHN0ZXAzUmVzdWx0LCAnU3RlcCAzJyk7XG4gICAgaWYgKHN0ZXAzUmVzdWx0Lm5vT3ApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICdPcnBoYW5Ob09wJyxcbiAgICAgICAgJ09ycGhhbiBzdGVwIDMgd2FzIHVuZXhwZWN0ZWRseSBhIG5vLW9wIOKAlCB0aGUgcmVzb3VyY2VzIHdlcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgc3RhY2suICcgK1xuICAgICAgICAnSWYgdGhpcyBpc3N1ZSBwZXJzaXN0cywgcGxlYXNlIG9wZW4gYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrLWNsaS9pc3N1ZXMgJyArXG4gICAgICAgICd3aXRoIHlvdXIgc3RhY2sgdGVtcGxhdGUgYXR0YWNoZWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VNYXBwaW5nID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUlkZW50aWZpZXJzKHN0YWNrLCBsb2dpY2FsSWRzLCBwaHlzaWNhbElkcywgY3VycmVudFRlbXBsYXRlKTtcbiAgICByZXR1cm4geyByZXNvdXJjZU1hcHBpbmcgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3kgYSB0ZW1wbGF0ZSBvdmVycmlkZSB0byB0aGUgc3RhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlcGxveVN0YWNrKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIHRlbXBsYXRlOiBhbnksIGNoYW5nZVNldE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmRlcGxveW1lbnRzLmRlcGxveVN0YWNrKHtcbiAgICAgIHN0YWNrLFxuICAgICAgcm9sZUFybjogdGhpcy5yb2xlQXJuLFxuICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgZGVwbG95bWVudE1ldGhvZDogeyBtZXRob2Q6ICdjaGFuZ2Utc2V0JywgY2hhbmdlU2V0TmFtZSB9LFxuICAgICAgb3ZlcnJpZGVUZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IHRydWUsXG4gICAgICBmb3JjZURlcGxveW1lbnQ6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBHZXRBdHQgYXR0cmlidXRlIHZhbHVlcyBmb3Igb3JwaGFuZWQgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBDdXJyZW50IHN0cmF0ZWd5OiBpbmplY3QgdGVtcG9yYXJ5IE91dHB1dHMgaW50byB0aGUgc3RhY2sgdGhhdCByZWZlcmVuY2VcbiAgICogZWFjaCBHZXRBdHQsIGRlcGxveSwgdGhlbiByZWFkIHRoZSByZXNvbHZlZCB2YWx1ZXMgZnJvbSBEZXNjcmliZVN0YWNrcy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbnRpb25hbGx5IGRlY291cGxlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBvcnBoYW4gZmxvd1xuICAgKiBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIENsb3VkIENvbnRyb2wgQVBJLWJhc2VkIGFwcHJvYWNoIGxhdGVyLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgY29tcGxldGUgbWFwIG9mIHJlc29sdmVkIHZhbHVlcyAoUmVmICsgYXR0cnMpIGZvciBlYWNoIGxvZ2ljYWwgSUQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVHZXRBdHRWYWx1ZXMoXG4gICAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICBjZm46IElDbG91ZEZvcm1hdGlvbkNsaWVudCxcbiAgICBsb2dpY2FsSWRzOiBzdHJpbmdbXSxcbiAgICBjdXJyZW50VGVtcGxhdGU6IGFueSxcbiAgICBwaHlzaWNhbElkczogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBSZXNvbHZlZFZhbHVlcz4+IHtcbiAgICAvLyBCdWlsZCBSZWYgdmFsdWVzIGZyb20gcGh5c2ljYWwgSURzXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIFJlc29sdmVkVmFsdWVzPigpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgbG9naWNhbElkcykge1xuICAgICAgY29uc3QgcGh5c2ljYWxJZCA9IHBoeXNpY2FsSWRzLmdldChpZCk7XG4gICAgICBpZiAoIXBoeXNpY2FsSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignT3JwaGFuTWlzc2luZ1BoeXNpY2FsSWQnLCBgQ291bGQgbm90IHJlc29sdmUgcGh5c2ljYWwgcmVzb3VyY2UgSUQgZm9yICcke2lkfSdgKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlcy5zZXQoaWQsIHsgcmVmOiBwaHlzaWNhbElkLCBhdHRyczoge30gfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0QXR0UmVmcyA9IHRoaXMuZmluZEdldEF0dFJlZmVyZW5jZXMoY3VycmVudFRlbXBsYXRlLCBsb2dpY2FsSWRzKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBHZXRBdHQgcmVmZXJlbmNlcywgc2tpcCB0aGUgZGVwbG95XG4gICAgaWYgKGdldEF0dFJlZnMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgdGVtcG9yYXJ5IG91dHB1dHMgc28gQ2xvdWRGb3JtYXRpb24gcmVzb2x2ZXMgdGhlIEdldEF0dCB2YWx1ZXNcbiAgICBjb25zdCByZXNvbHZlVGVtcGxhdGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRUZW1wbGF0ZSkpO1xuICAgIGlmICghcmVzb2x2ZVRlbXBsYXRlLk91dHB1dHMpIHtcbiAgICAgIHJlc29sdmVUZW1wbGF0ZS5PdXRwdXRzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgW291dHB1dEtleSwgcmVmXSBvZiBnZXRBdHRSZWZzKSB7XG4gICAgICByZXNvbHZlVGVtcGxhdGUuT3V0cHV0c1tvdXRwdXRLZXldID0ge1xuICAgICAgICBWYWx1ZTogeyAnRm46OkdldEF0dCc6IFtyZWYubG9naWNhbElkLCByZWYuYXR0cl0gfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcDFSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveVN0YWNrKHN0YWNrLCByZXNvbHZlVGVtcGxhdGUsICdjZGstb3JwaGFuLXN0ZXAxJyk7XG4gICAgYXNzZXJ0RGVwbG95U3VjY2VlZGVkKHN0ZXAxUmVzdWx0LCAnU3RlcCAxJyk7XG5cbiAgICAvLyBSZWFkIHJlc29sdmVkIHZhbHVlcyBmcm9tIHN0YWNrIG91dHB1dHNcbiAgICBjb25zdCBzdGFja0Rlc2MgPSBhd2FpdCBjZm4uZGVzY3JpYmVTdGFja3MoeyBTdGFja05hbWU6IHN0YWNrLnN0YWNrTmFtZSB9KTtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBzdGFja0Rlc2MuU3RhY2tzPy5bMF0/Lk91dHB1dHMgPz8gW10pIHtcbiAgICAgIGlmICghb3V0cHV0Lk91dHB1dEtleSB8fCAhb3V0cHV0Lk91dHB1dFZhbHVlKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJlZiA9IGdldEF0dFJlZnMuZ2V0KG91dHB1dC5PdXRwdXRLZXkpO1xuICAgICAgaWYgKHJlZikge1xuICAgICAgICB2YWx1ZXMuZ2V0KHJlZi5sb2dpY2FsSWQpIS5hdHRyc1tyZWYuYXR0cl0gPSBvdXRwdXQuT3V0cHV0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZEdldEF0dFJlZmVyZW5jZXModGVtcGxhdGU6IGFueSwgbG9naWNhbElkczogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCB7IGxvZ2ljYWxJZDogc3RyaW5nOyBhdHRyOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHJlZnMgPSBuZXcgTWFwPHN0cmluZywgeyBsb2dpY2FsSWQ6IHN0cmluZzsgYXR0cjogc3RyaW5nIH0+KCk7XG5cbiAgICBjb25zdCBhZGRSZWYgPSAoaWQ6IHN0cmluZywgYXR0cjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXRLZXkgPSBgQ2RrT3JwaGFuJHtpZH0ke2F0dHJ9YC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgJycpO1xuICAgICAgaWYgKCFyZWZzLmhhcyhvdXRwdXRLZXkpKSB7XG4gICAgICAgIHJlZnMuc2V0KG91dHB1dEtleSwgeyBsb2dpY2FsSWQ6IGlkLCBhdHRyIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBzY2FuU3ViU3RyaW5nID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBNYXRjaCAke0xvZ2ljYWxJZC5BdHRyfSBwYXR0ZXJucyBpbiBGbjo6U3ViIGZvcm1hdCBzdHJpbmdzXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL1xcJFxceyhbXn0uXSspXFwuKFtefV0rKVxcfS9nO1xuICAgICAgbGV0IG1hdGNoO1xuICAgICAgd2hpbGUgKChtYXRjaCA9IHBhdHRlcm4uZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBbLCBpZCwgYXR0cl0gPSBtYXRjaDtcbiAgICAgICAgaWYgKGxvZ2ljYWxJZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgYWRkUmVmKGlkLCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB3YWxrT2JqZWN0KHRlbXBsYXRlLCAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBFeHBsaWNpdCBGbjo6R2V0QXR0XG4gICAgICAgIGNvbnN0IGdldEF0dCA9IHZhbHVlWydGbjo6R2V0QXR0J107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGdldEF0dCkgJiYgbG9naWNhbElkcy5pbmNsdWRlcyhnZXRBdHRbMF0pKSB7XG4gICAgICAgICAgYWRkUmVmKGdldEF0dFswXSwgZ2V0QXR0WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcGxpY2l0IEdldEF0dCBpbnNpZGUgRm46OlN1YlxuICAgICAgICBjb25zdCBzdWIgPSB2YWx1ZVsnRm46OlN1YiddO1xuICAgICAgICBpZiAodHlwZW9mIHN1YiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzY2FuU3ViU3RyaW5nKHN1Yik7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdWIpICYmIHR5cGVvZiBzdWJbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc2NhblN1YlN0cmluZyhzdWJbMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVmcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVzb3VyY2VJZGVudGlmaWVycyhcbiAgICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIGxvZ2ljYWxJZHM6IHN0cmluZ1tdLFxuICAgIHBoeXNpY2FsSWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHRlbXBsYXRlOiBhbnksXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge307XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VtbWFyaWVzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50cy5yZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMoc3RhY2spO1xuXG4gICAgICBjb25zdCBpZGVudGlmaWVyc0J5VHlwZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBzdW1tYXJpZXMpIHtcbiAgICAgICAgaWYgKHN1bW1hcnkuUmVzb3VyY2VUeXBlICYmIHN1bW1hcnkuUmVzb3VyY2VJZGVudGlmaWVycykge1xuICAgICAgICAgIGlkZW50aWZpZXJzQnlUeXBlLnNldChzdW1tYXJ5LlJlc291cmNlVHlwZSwgc3VtbWFyeS5SZXNvdXJjZUlkZW50aWZpZXJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvdXJjZXMgPSB0ZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge307XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgbG9naWNhbElkcykge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IHJlc291cmNlc1tpZF07XG4gICAgICAgIGlmICghcmVzb3VyY2UpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJQcm9wcyA9IGlkZW50aWZpZXJzQnlUeXBlLmdldChyZXNvdXJjZS5UeXBlKTtcbiAgICAgICAgaWYgKCFpZGVudGlmaWVyUHJvcHMgfHwgaWRlbnRpZmllclByb3BzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaWRlbnRpZmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc291cmNlLlByb3BlcnRpZXMgPz8ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGlkZW50aWZpZXJQcm9wcykge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wXSAmJiB0eXBlb2YgcHJvcHNbcHJvcF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZGVudGlmaWVyW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfSBlbHNlIGlmIChpZGVudGlmaWVyUHJvcHMubGVuZ3RoID09PSAxICYmIHBoeXNpY2FsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXJbcHJvcF0gPSBwaHlzaWNhbElkcy5nZXQoaWQpITtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaWRlbnRpZmllcikubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdFtpZF0gPSBpZGVudGlmaWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKGBDb3VsZCBub3QgcmV0cmlldmUgcmVzb3VyY2UgaWRlbnRpZmllcnMgZm9yIGltcG9ydDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Walk an object tree depth-first, calling visitor on every node.
3
+ */
4
+ export declare function walkObject(obj: any, visitor: (value: any) => void): void;
5
+ /**
6
+ * Replace all {Ref}, {Fn::GetAtt}, and {Fn::Sub} references to a logical ID with literal values.
7
+ */
8
+ export declare function replaceInObject(obj: any, logicalId: string, values: {
9
+ ref: string;
10
+ attrs: Record<string, string>;
11
+ }): any;
12
+ /**
13
+ * Replace all references to a logical ID across Resources, Outputs, and Conditions.
14
+ */
15
+ export declare function replaceReferences(template: any, logicalId: string, values: {
16
+ ref: string;
17
+ attrs: Record<string, string>;
18
+ }): void;
19
+ /**
20
+ * Remove all DependsOn references to a logical ID from the template.
21
+ */
22
+ export declare function removeDependsOn(template: any, logicalId: string): void;
23
+ /**
24
+ * Find all resources whose aws:cdk:path starts with `<stackName>/<constructPath>/`.
25
+ */
26
+ export declare function findResourcesByPath(resources: Record<string, any>, stackName: string, constructPath: string): string[];
27
+ /**
28
+ * Find resources in the remaining template that still reference any of the orphaned logical IDs.
29
+ */
30
+ export declare function findBlockingResources(remainingTemplate: any, orphanedIds: string[], fullTemplate: any): string[];
31
+ /**
32
+ * Check if any resources in the template have aws:cdk:path metadata at all.
33
+ * Used to detect if metadata has been disabled.
34
+ */
35
+ export declare function hasAnyCdkPathMetadata(resources: Record<string, any>): boolean;
36
+ import type { DeployStackResult, SuccessfulDeployStackResult } from '../../deployments/deployment-result';
37
+ /**
38
+ * Verify a deploy result completed successfully.
39
+ */
40
+ export declare function assertDeploySucceeded(result: DeployStackResult, step: string): asserts result is SuccessfulDeployStackResult;
41
+ /**
42
+ * CloudFormation requires at least one resource in the template.
43
+ * Add a placeholder if all resources were removed.
44
+ */
45
+ export declare function ensureNonEmptyResources(template: any): void;
46
+ /**
47
+ * Parse construct paths like `/MyStack/MyTable` or `MyStack/MyTable` into
48
+ * a stack construct ID and construct-level paths.
49
+ *
50
+ * All paths must reference the same stack.
51
+ */
52
+ export declare function parseAndValidateConstructPaths(paths: string[]): {
53
+ stackId: string;
54
+ constructPaths: string[];
55
+ };
56
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.walkObject = walkObject;
4
+ exports.replaceInObject = replaceInObject;
5
+ exports.replaceReferences = replaceReferences;
6
+ exports.removeDependsOn = removeDependsOn;
7
+ exports.findResourcesByPath = findResourcesByPath;
8
+ exports.findBlockingResources = findBlockingResources;
9
+ exports.hasAnyCdkPathMetadata = hasAnyCdkPathMetadata;
10
+ exports.assertDeploySucceeded = assertDeploySucceeded;
11
+ exports.ensureNonEmptyResources = ensureNonEmptyResources;
12
+ exports.parseAndValidateConstructPaths = parseAndValidateConstructPaths;
13
+ const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api");
14
+ /**
15
+ * Walk an object tree depth-first, calling visitor on every node.
16
+ */
17
+ function walkObject(obj, visitor) {
18
+ if (obj === null || obj === undefined)
19
+ return;
20
+ visitor(obj);
21
+ if (typeof obj === 'object') {
22
+ for (const value of Object.values(obj)) {
23
+ walkObject(value, visitor);
24
+ }
25
+ }
26
+ }
27
+ /**
28
+ * Replace all {Ref}, {Fn::GetAtt}, and {Fn::Sub} references to a logical ID with literal values.
29
+ */
30
+ function replaceInObject(obj, logicalId, values) {
31
+ if (obj === null || obj === undefined)
32
+ return obj;
33
+ if (typeof obj !== 'object')
34
+ return obj;
35
+ if (Array.isArray(obj)) {
36
+ return obj.map((item) => replaceInObject(item, logicalId, values));
37
+ }
38
+ if (Object.keys(obj).length === 1 && obj.Ref === logicalId) {
39
+ return values.ref;
40
+ }
41
+ if (Object.keys(obj).length === 1 && Array.isArray(obj['Fn::GetAtt']) && obj['Fn::GetAtt'][0] === logicalId) {
42
+ const attr = obj['Fn::GetAtt'][1];
43
+ if (values.attrs[attr]) {
44
+ return values.attrs[attr];
45
+ }
46
+ }
47
+ // Handle Fn::Sub implicit references: ${LogicalId} and ${LogicalId.Attr}
48
+ if (obj['Fn::Sub'] !== undefined) {
49
+ const sub = obj['Fn::Sub'];
50
+ const replaceSubString = (str) => {
51
+ // Replace ${LogicalId.Attr} with the resolved attribute value
52
+ for (const [attr, val] of Object.entries(values.attrs)) {
53
+ str = str.replace(new RegExp(`\\$\\{${logicalId}\\.${attr}\\}`, 'g'), val);
54
+ }
55
+ // Replace ${LogicalId} with the resolved Ref value
56
+ str = str.replace(new RegExp(`\\$\\{${logicalId}\\}`, 'g'), values.ref);
57
+ return str;
58
+ };
59
+ if (typeof sub === 'string') {
60
+ return { 'Fn::Sub': replaceSubString(sub) };
61
+ }
62
+ if (Array.isArray(sub) && typeof sub[0] === 'string') {
63
+ return {
64
+ 'Fn::Sub': [
65
+ replaceSubString(sub[0]),
66
+ sub[1] ? replaceInObject(sub[1], logicalId, values) : sub[1],
67
+ ],
68
+ };
69
+ }
70
+ }
71
+ const result = {};
72
+ for (const [key, value] of Object.entries(obj)) {
73
+ result[key] = replaceInObject(value, logicalId, values);
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Replace all references to a logical ID across Resources, Outputs, and Conditions.
79
+ */
80
+ function replaceReferences(template, logicalId, values) {
81
+ for (const section of ['Resources', 'Outputs', 'Conditions']) {
82
+ if (!template[section])
83
+ continue;
84
+ for (const [key, value] of Object.entries(template[section])) {
85
+ if (section === 'Resources' && key === logicalId)
86
+ continue;
87
+ template[section][key] = replaceInObject(value, logicalId, values);
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Remove all DependsOn references to a logical ID from the template.
93
+ */
94
+ function removeDependsOn(template, logicalId) {
95
+ for (const resource of Object.values(template.Resources ?? {})) {
96
+ const res = resource;
97
+ if (Array.isArray(res.DependsOn)) {
98
+ res.DependsOn = res.DependsOn.filter((dep) => dep !== logicalId);
99
+ if (res.DependsOn.length === 0)
100
+ delete res.DependsOn;
101
+ }
102
+ else if (res.DependsOn === logicalId) {
103
+ delete res.DependsOn;
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Find all resources whose aws:cdk:path starts with `<stackName>/<constructPath>/`.
109
+ */
110
+ function findResourcesByPath(resources, stackName, constructPath) {
111
+ const prefix = `${stackName}/${constructPath}/`;
112
+ const ids = [];
113
+ for (const [id, resource] of Object.entries(resources)) {
114
+ const cdkPath = resource.Metadata?.[cloud_assembly_api_1.PATH_METADATA_KEY] ?? '';
115
+ if (cdkPath.startsWith(prefix)) {
116
+ ids.push(id);
117
+ }
118
+ }
119
+ return ids;
120
+ }
121
+ /**
122
+ * Find resources in the remaining template that still reference any of the orphaned logical IDs.
123
+ */
124
+ function findBlockingResources(remainingTemplate, orphanedIds, fullTemplate) {
125
+ const blockers = [];
126
+ const remaining = remainingTemplate.Resources ?? {};
127
+ const full = fullTemplate.Resources ?? {};
128
+ for (const [id, resource] of Object.entries(full)) {
129
+ if (orphanedIds.includes(id))
130
+ continue;
131
+ if (!remaining[id])
132
+ continue;
133
+ let references = false;
134
+ walkObject(resource, (value) => {
135
+ if (references)
136
+ return;
137
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
138
+ if (value.Ref && orphanedIds.includes(value.Ref))
139
+ references = true;
140
+ const getAtt = value['Fn::GetAtt'];
141
+ if (Array.isArray(getAtt) && orphanedIds.includes(getAtt[0]))
142
+ references = true;
143
+ }
144
+ });
145
+ const deps = resource.DependsOn;
146
+ if (typeof deps === 'string' && orphanedIds.includes(deps))
147
+ references = true;
148
+ if (Array.isArray(deps) && deps.some((d) => orphanedIds.includes(d)))
149
+ references = true;
150
+ if (references) {
151
+ const path = resource.Metadata?.[cloud_assembly_api_1.PATH_METADATA_KEY] ?? id;
152
+ blockers.push(path);
153
+ }
154
+ }
155
+ return blockers;
156
+ }
157
+ /**
158
+ * Check if any resources in the template have aws:cdk:path metadata at all.
159
+ * Used to detect if metadata has been disabled.
160
+ */
161
+ function hasAnyCdkPathMetadata(resources) {
162
+ for (const resource of Object.values(resources)) {
163
+ if (resource.Metadata?.[cloud_assembly_api_1.PATH_METADATA_KEY]) {
164
+ return true;
165
+ }
166
+ }
167
+ return false;
168
+ }
169
+ const toolkit_error_1 = require("../../../toolkit/toolkit-error");
170
+ /**
171
+ * Verify a deploy result completed successfully.
172
+ */
173
+ function assertDeploySucceeded(result, step) {
174
+ if (result.type !== 'did-deploy-stack') {
175
+ throw new toolkit_error_1.ToolkitError('OrphanDeployFailed', `${step}: unexpected deployment result '${result.type}'`);
176
+ }
177
+ }
178
+ /**
179
+ * CloudFormation requires at least one resource in the template.
180
+ * Add a placeholder if all resources were removed.
181
+ */
182
+ function ensureNonEmptyResources(template) {
183
+ if (Object.keys(template.Resources ?? {}).length === 0) {
184
+ template.Resources = {
185
+ CDKOrphanPlaceholder: {
186
+ Type: 'AWS::CloudFormation::WaitConditionHandle',
187
+ },
188
+ };
189
+ }
190
+ }
191
+ /**
192
+ * Parse construct paths like `/MyStack/MyTable` or `MyStack/MyTable` into
193
+ * a stack construct ID and construct-level paths.
194
+ *
195
+ * All paths must reference the same stack.
196
+ */
197
+ function parseAndValidateConstructPaths(paths) {
198
+ if (paths.length === 0) {
199
+ throw new toolkit_error_1.ToolkitError('MissingConstructPath', 'At least one construct path is required (e.g. cdk orphan MyStack/MyTable)');
200
+ }
201
+ const constructPaths = [];
202
+ let stackId;
203
+ for (const raw of paths) {
204
+ const p = raw.replace(/^\//, ''); // strip leading slash
205
+ const slashIdx = p.indexOf('/');
206
+ if (slashIdx < 0) {
207
+ throw new toolkit_error_1.ToolkitError('InvalidConstructPath', `Construct path '${raw}' must include both a stack name and a construct path separated by '/' (e.g. MyStack/MyTable)`);
208
+ }
209
+ const thisStack = p.substring(0, slashIdx);
210
+ const constructPath = p.substring(slashIdx + 1);
211
+ if (stackId && thisStack !== stackId) {
212
+ throw new toolkit_error_1.ToolkitError('MultipleStacks', `All construct paths must reference the same stack, but got '${stackId}' and '${thisStack}'`);
213
+ }
214
+ stackId = thisStack;
215
+ constructPaths.push(constructPath);
216
+ }
217
+ return { stackId: stackId, constructPaths };
218
+ }
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxnQ0FRQztBQUtELDBDQWtEQztBQUtELDhDQVlDO0FBS0QsMENBVUM7QUFLRCxrREFVQztBQUtELHNEQThCQztBQU1ELHNEQU9DO0FBUUQsc0RBSUM7QUFNRCwwREFRQztBQVFELHdFQTBCQztBQS9ORCxvRUFBZ0U7QUFFaEU7O0dBRUc7QUFDSCxTQUFnQixVQUFVLENBQUMsR0FBUSxFQUFFLE9BQTZCO0lBQ2hFLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU87SUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLEdBQVEsRUFBRSxTQUFpQixFQUFFLE1BQXNEO0lBQ2pILElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ2xELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRXhDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxNQUFNLENB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QUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBQ3hELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLDRCQUFZLENBQUMsc0JBQXNCLEVBQUUsbUJBQW1CLEdBQUcsK0ZBQStGLENBQUMsQ0FBQztRQUN4SyxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFaEQsSUFBSSxPQUFPLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSw0QkFBWSxDQUFDLGdCQUFnQixFQUFFLCtEQUErRCxPQUFPLFVBQVUsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN6SSxDQUFDO1FBQ0QsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUNwQixjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUEFUSF9NRVRBREFUQV9LRVkgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuXG4vKipcbiAqIFdhbGsgYW4gb2JqZWN0IHRyZWUgZGVwdGgtZmlyc3QsIGNhbGxpbmcgdmlzaXRvciBvbiBldmVyeSBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2Fsa09iamVjdChvYmo6IGFueSwgdmlzaXRvcjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB2aXNpdG9yKG9iaik7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhvYmopKSB7XG4gICAgICB3YWxrT2JqZWN0KHZhbHVlLCB2aXNpdG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlIGFsbCB7UmVmfSwge0ZuOjpHZXRBdHR9LCBhbmQge0ZuOjpTdWJ9IHJlZmVyZW5jZXMgdG8gYSBsb2dpY2FsIElEIHdpdGggbGl0ZXJhbCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlSW5PYmplY3Qob2JqOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nLCB2YWx1ZXM6IHsgcmVmOiBzdHJpbmc7IGF0dHJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0pOiBhbnkge1xuICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBvYmo7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXBsYWNlSW5PYmplY3QoaXRlbSwgbG9naWNhbElkLCB2YWx1ZXMpKTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMSAmJiBvYmouUmVmID09PSBsb2dpY2FsSWQpIHtcbiAgICByZXR1cm4gdmFsdWVzLnJlZjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KG9ialsnRm46OkdldEF0dCddKSAmJiBvYmpbJ0ZuOjpHZXRBdHQnXVswXSA9PT0gbG9naWNhbElkKSB7XG4gICAgY29uc3QgYXR0ciA9IG9ialsnRm46OkdldEF0dCddWzFdO1xuICAgIGlmICh2YWx1ZXMuYXR0cnNbYXR0cl0pIHtcbiAgICAgIHJldHVybiB2YWx1ZXMuYXR0cnNbYXR0cl07XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIEZuOjpTdWIgaW1wbGljaXQgcmVmZXJlbmNlczogJHtMb2dpY2FsSWR9IGFuZCAke0xvZ2ljYWxJZC5BdHRyfVxuICBpZiAob2JqWydGbjo6U3ViJ10gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHN1YiA9IG9ialsnRm46OlN1YiddO1xuICAgIGNvbnN0IHJlcGxhY2VTdWJTdHJpbmcgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgLy8gUmVwbGFjZSAke0xvZ2ljYWxJZC5BdHRyfSB3aXRoIHRoZSByZXNvbHZlZCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgIGZvciAoY29uc3QgW2F0dHIsIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWVzLmF0dHJzKSkge1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJFxcXFx7JHtsb2dpY2FsSWR9XFxcXC4ke2F0dHJ9XFxcXH1gLCAnZycpLCB2YWwpO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGFjZSAke0xvZ2ljYWxJZH0gd2l0aCB0aGUgcmVzb2x2ZWQgUmVmIHZhbHVlXG4gICAgICBzdHIgPSBzdHIucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJFxcXFx7JHtsb2dpY2FsSWR9XFxcXH1gLCAnZycpLCB2YWx1ZXMucmVmKTtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2Ygc3ViID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgJ0ZuOjpTdWInOiByZXBsYWNlU3ViU3RyaW5nKHN1YikgfTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViKSAmJiB0eXBlb2Ygc3ViWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ0ZuOjpTdWInOiBbXG4gICAgICAgICAgcmVwbGFjZVN1YlN0cmluZyhzdWJbMF0pLFxuICAgICAgICAgIHN1YlsxXSA/IHJlcGxhY2VJbk9iamVjdChzdWJbMV0sIGxvZ2ljYWxJZCwgdmFsdWVzKSA6IHN1YlsxXSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIHJlc3VsdFtrZXldID0gcmVwbGFjZUluT2JqZWN0KHZhbHVlLCBsb2dpY2FsSWQsIHZhbHVlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGEgbG9naWNhbCBJRCBhY3Jvc3MgUmVzb3VyY2VzLCBPdXRwdXRzLCBhbmQgQ29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VSZWZlcmVuY2VzKFxuICB0ZW1wbGF0ZTogYW55LFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgdmFsdWVzOiB7IHJlZjogc3RyaW5nOyBhdHRyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9LFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBbJ1Jlc291cmNlcycsICdPdXRwdXRzJywgJ0NvbmRpdGlvbnMnXSkge1xuICAgIGlmICghdGVtcGxhdGVbc2VjdGlvbl0pIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlW3NlY3Rpb25dKSkge1xuICAgICAgaWYgKHNlY3Rpb24gPT09ICdSZXNvdXJjZXMnICYmIGtleSA9PT0gbG9naWNhbElkKSBjb250aW51ZTtcbiAgICAgIHRlbXBsYXRlW3NlY3Rpb25dW2tleV0gPSByZXBsYWNlSW5PYmplY3QodmFsdWUsIGxvZ2ljYWxJZCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgYWxsIERlcGVuZHNPbiByZWZlcmVuY2VzIHRvIGEgbG9naWNhbCBJRCBmcm9tIHRoZSB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURlcGVuZHNPbih0ZW1wbGF0ZTogYW55LCBsb2dpY2FsSWQ6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIE9iamVjdC52YWx1ZXModGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KSkge1xuICAgIGNvbnN0IHJlcyA9IHJlc291cmNlIGFzIGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMuRGVwZW5kc09uKSkge1xuICAgICAgcmVzLkRlcGVuZHNPbiA9IHJlcy5EZXBlbmRzT24uZmlsdGVyKChkZXA6IHN0cmluZykgPT4gZGVwICE9PSBsb2dpY2FsSWQpO1xuICAgICAgaWYgKHJlcy5EZXBlbmRzT24ubGVuZ3RoID09PSAwKSBkZWxldGUgcmVzLkRlcGVuZHNPbjtcbiAgICB9IGVsc2UgaWYgKHJlcy5EZXBlbmRzT24gPT09IGxvZ2ljYWxJZCkge1xuICAgICAgZGVsZXRlIHJlcy5EZXBlbmRzT247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluZCBhbGwgcmVzb3VyY2VzIHdob3NlIGF3czpjZGs6cGF0aCBzdGFydHMgd2l0aCBgPHN0YWNrTmFtZT4vPGNvbnN0cnVjdFBhdGg+L2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUmVzb3VyY2VzQnlQYXRoKHJlc291cmNlczogUmVjb3JkPHN0cmluZywgYW55Piwgc3RhY2tOYW1lOiBzdHJpbmcsIGNvbnN0cnVjdFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7c3RhY2tOYW1lfS8ke2NvbnN0cnVjdFBhdGh9L2A7XG4gIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaWQsIHJlc291cmNlXSBvZiBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpKSB7XG4gICAgY29uc3QgY2RrUGF0aCA9IHJlc291cmNlLk1ldGFkYXRhPy5bUEFUSF9NRVRBREFUQV9LRVldID8/ICcnO1xuICAgIGlmIChjZGtQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgaWRzLnB1c2goaWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaWRzO1xufVxuXG4vKipcbiAqIEZpbmQgcmVzb3VyY2VzIGluIHRoZSByZW1haW5pbmcgdGVtcGxhdGUgdGhhdCBzdGlsbCByZWZlcmVuY2UgYW55IG9mIHRoZSBvcnBoYW5lZCBsb2dpY2FsIElEcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRCbG9ja2luZ1Jlc291cmNlcyhyZW1haW5pbmdUZW1wbGF0ZTogYW55LCBvcnBoYW5lZElkczogc3RyaW5nW10sIGZ1bGxUZW1wbGF0ZTogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBibG9ja2Vyczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVtYWluaW5nID0gcmVtYWluaW5nVGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9O1xuICBjb25zdCBmdWxsID0gZnVsbFRlbXBsYXRlLlJlc291cmNlcyA/PyB7fTtcblxuICBmb3IgKGNvbnN0IFtpZCwgcmVzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKGZ1bGwpIGFzIFtzdHJpbmcsIGFueV1bXSkge1xuICAgIGlmIChvcnBoYW5lZElkcy5pbmNsdWRlcyhpZCkpIGNvbnRpbnVlO1xuICAgIGlmICghcmVtYWluaW5nW2lkXSkgY29udGludWU7XG5cbiAgICBsZXQgcmVmZXJlbmNlcyA9IGZhbHNlO1xuICAgIHdhbGtPYmplY3QocmVzb3VyY2UsICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHJlZmVyZW5jZXMpIHJldHVybjtcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUuUmVmICYmIG9ycGhhbmVkSWRzLmluY2x1ZGVzKHZhbHVlLlJlZikpIHJlZmVyZW5jZXMgPSB0cnVlO1xuICAgICAgICBjb25zdCBnZXRBdHQgPSB2YWx1ZVsnRm46OkdldEF0dCddO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShnZXRBdHQpICYmIG9ycGhhbmVkSWRzLmluY2x1ZGVzKGdldEF0dFswXSkpIHJlZmVyZW5jZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVwcyA9IHJlc291cmNlLkRlcGVuZHNPbjtcbiAgICBpZiAodHlwZW9mIGRlcHMgPT09ICdzdHJpbmcnICYmIG9ycGhhbmVkSWRzLmluY2x1ZGVzKGRlcHMpKSByZWZlcmVuY2VzID0gdHJ1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBzKSAmJiBkZXBzLnNvbWUoKGQ6IHN0cmluZykgPT4gb3JwaGFuZWRJZHMuaW5jbHVkZXMoZCkpKSByZWZlcmVuY2VzID0gdHJ1ZTtcblxuICAgIGlmIChyZWZlcmVuY2VzKSB7XG4gICAgICBjb25zdCBwYXRoID0gKHJlc291cmNlIGFzIGFueSkuTWV0YWRhdGE/LltQQVRIX01FVEFEQVRBX0tFWV0gPz8gaWQ7XG4gICAgICBibG9ja2Vycy5wdXNoKHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBibG9ja2Vycztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbnkgcmVzb3VyY2VzIGluIHRoZSB0ZW1wbGF0ZSBoYXZlIGF3czpjZGs6cGF0aCBtZXRhZGF0YSBhdCBhbGwuXG4gKiBVc2VkIHRvIGRldGVjdCBpZiBtZXRhZGF0YSBoYXMgYmVlbiBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0FueUNka1BhdGhNZXRhZGF0YShyZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBPYmplY3QudmFsdWVzKHJlc291cmNlcykpIHtcbiAgICBpZiAoKHJlc291cmNlIGFzIGFueSkuTWV0YWRhdGE/LltQQVRIX01FVEFEQVRBX0tFWV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgdHlwZSB7IERlcGxveVN0YWNrUmVzdWx0LCBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfSBmcm9tICcuLi8uLi9kZXBsb3ltZW50cy9kZXBsb3ltZW50LXJlc3VsdCc7XG5cbi8qKlxuICogVmVyaWZ5IGEgZGVwbG95IHJlc3VsdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVwbG95U3VjY2VlZGVkKHJlc3VsdDogRGVwbG95U3RhY2tSZXN1bHQsIHN0ZXA6IHN0cmluZyk6IGFzc2VydHMgcmVzdWx0IGlzIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB7XG4gIGlmIChyZXN1bHQudHlwZSAhPT0gJ2RpZC1kZXBsb3ktc3RhY2snKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignT3JwaGFuRGVwbG95RmFpbGVkJywgYCR7c3RlcH06IHVuZXhwZWN0ZWQgZGVwbG95bWVudCByZXN1bHQgJyR7cmVzdWx0LnR5cGV9J2ApO1xuICB9XG59XG5cbi8qKlxuICogQ2xvdWRGb3JtYXRpb24gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIHRoZSB0ZW1wbGF0ZS5cbiAqIEFkZCBhIHBsYWNlaG9sZGVyIGlmIGFsbCByZXNvdXJjZXMgd2VyZSByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTm9uRW1wdHlSZXNvdXJjZXModGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICBpZiAoT2JqZWN0LmtleXModGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICB0ZW1wbGF0ZS5SZXNvdXJjZXMgPSB7XG4gICAgICBDREtPcnBoYW5QbGFjZWhvbGRlcjoge1xuICAgICAgICBUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6V2FpdENvbmRpdGlvbkhhbmRsZScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBjb25zdHJ1Y3QgcGF0aHMgbGlrZSBgL015U3RhY2svTXlUYWJsZWAgb3IgYE15U3RhY2svTXlUYWJsZWAgaW50b1xuICogYSBzdGFjayBjb25zdHJ1Y3QgSUQgYW5kIGNvbnN0cnVjdC1sZXZlbCBwYXRocy5cbiAqXG4gKiBBbGwgcGF0aHMgbXVzdCByZWZlcmVuY2UgdGhlIHNhbWUgc3RhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFuZFZhbGlkYXRlQ29uc3RydWN0UGF0aHMocGF0aHM6IHN0cmluZ1tdKTogeyBzdGFja0lkOiBzdHJpbmc7IGNvbnN0cnVjdFBhdGhzOiBzdHJpbmdbXSB9IHtcbiAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ01pc3NpbmdDb25zdHJ1Y3RQYXRoJywgJ0F0IGxlYXN0IG9uZSBjb25zdHJ1Y3QgcGF0aCBpcyByZXF1aXJlZCAoZS5nLiBjZGsgb3JwaGFuIE15U3RhY2svTXlUYWJsZSknKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnN0cnVjdFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgc3RhY2tJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmF3IG9mIHBhdGhzKSB7XG4gICAgY29uc3QgcCA9IHJhdy5yZXBsYWNlKC9eXFwvLywgJycpOyAvLyBzdHJpcCBsZWFkaW5nIHNsYXNoXG4gICAgY29uc3Qgc2xhc2hJZHggPSBwLmluZGV4T2YoJy8nKTtcbiAgICBpZiAoc2xhc2hJZHggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdJbnZhbGlkQ29uc3RydWN0UGF0aCcsIGBDb25zdHJ1Y3QgcGF0aCAnJHtyYXd9JyBtdXN0IGluY2x1ZGUgYm90aCBhIHN0YWNrIG5hbWUgYW5kIGEgY29uc3RydWN0IHBhdGggc2VwYXJhdGVkIGJ5ICcvJyAoZS5nLiBNeVN0YWNrL015VGFibGUpYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGhpc1N0YWNrID0gcC5zdWJzdHJpbmcoMCwgc2xhc2hJZHgpO1xuICAgIGNvbnN0IGNvbnN0cnVjdFBhdGggPSBwLnN1YnN0cmluZyhzbGFzaElkeCArIDEpO1xuXG4gICAgaWYgKHN0YWNrSWQgJiYgdGhpc1N0YWNrICE9PSBzdGFja0lkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdNdWx0aXBsZVN0YWNrcycsIGBBbGwgY29uc3RydWN0IHBhdGhzIG11c3QgcmVmZXJlbmNlIHRoZSBzYW1lIHN0YWNrLCBidXQgZ290ICcke3N0YWNrSWR9JyBhbmQgJyR7dGhpc1N0YWNrfSdgKTtcbiAgICB9XG4gICAgc3RhY2tJZCA9IHRoaXNTdGFjaztcbiAgICBjb25zdHJ1Y3RQYXRocy5wdXNoKGNvbnN0cnVjdFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhY2tJZDogc3RhY2tJZCEsIGNvbnN0cnVjdFBhdGhzIH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './helpers';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./helpers"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzJztcbiJdfQ==
@@ -103,7 +103,11 @@ export declare class ResourceImporter {
103
103
  /**
104
104
  * Load the resources to import from a file
105
105
  */
106
- loadResourceIdentifiers(available: ImportableResource[], filename: string): Promise<ImportMap>;
106
+ loadResourceIdentifiersFromFile(available: ImportableResource[], fileName: string): Promise<ImportMap>;
107
+ /**
108
+ * Load the resources to import from a mapping (JSON string or pre-parsed object)
109
+ */
110
+ loadResourceIdentifiers(available: ImportableResource[], identifiers: string | Record<string, ResourceIdentifierProperties>): Promise<ImportMap>;
107
111
  /**
108
112
  * Based on the provided resource mapping, prepare CFN structures for import (template,
109
113
  * ResourcesToImport structure) and perform the import operation (CloudFormation deployment)