aws-cdk 2.1006.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_LICENSES +104 -86
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/aws-auth.d.ts +1 -0
- package/lib/api/{logs/index.js → aws-auth.js} +2 -3
- package/lib/api/bootstrap.d.ts +1 -0
- package/lib/api/bootstrap.js +18 -0
- package/lib/api/cloud-assembly.d.ts +1 -0
- package/lib/api/cloud-assembly.js +18 -0
- package/lib/api/cloudformation.d.ts +1 -0
- package/lib/api/cloudformation.js +18 -0
- package/lib/api/context.d.ts +1 -40
- package/lib/api/context.js +16 -80
- package/lib/api/deployments.d.ts +1 -0
- package/lib/api/deployments.js +18 -0
- package/lib/api/environment.d.ts +1 -0
- package/lib/api/environment.js +18 -0
- package/lib/api/garbage-collection.d.ts +1 -0
- package/lib/api/garbage-collection.js +18 -0
- package/lib/api/hotswap.d.ts +1 -0
- package/lib/api/hotswap.js +18 -0
- package/lib/api/index.d.ts +5 -1
- package/lib/api/index.js +6 -2
- package/lib/api/logs-monitor.d.ts +1 -0
- package/lib/api/logs-monitor.js +18 -0
- package/lib/api/notices.d.ts +1 -0
- package/lib/api/notices.js +18 -0
- package/lib/api/plugin.d.ts +1 -0
- package/lib/api/{resource-import/index.js → plugin.js} +2 -3
- package/lib/api/resource-import.d.ts +1 -0
- package/lib/api/resource-import.js +18 -0
- package/lib/api/rwlock.d.ts +1 -0
- package/lib/api/{garbage-collection/index.js → rwlock.js} +2 -2
- package/lib/api/settings.d.ts +1 -26
- package/lib/api/settings.js +16 -103
- package/lib/api/stack-events.d.ts +1 -0
- package/lib/api/stack-events.js +18 -0
- package/lib/api/tags.d.ts +1 -9
- package/lib/api/tags.js +16 -8
- package/lib/api/toolkit-info.d.ts +1 -52
- package/lib/api/toolkit-info.js +16 -152
- package/lib/api/tree.d.ts +1 -31
- package/lib/api/tree.js +16 -35
- package/lib/api/work-graph.d.ts +1 -0
- package/lib/api/work-graph.js +18 -0
- package/lib/api-private.d.ts +3 -0
- package/lib/api-private.js +22 -0
- package/lib/cli/cdk-toolkit.d.ts +20 -16
- package/lib/cli/cdk-toolkit.js +102 -37
- package/lib/cli/cli-config.js +2 -2
- package/lib/cli/cli.d.ts +1 -1
- package/lib/cli/cli.js +22 -19
- package/lib/cli/io-host/cli-io-host.js +2 -2
- package/lib/cli/pretty-print-error.js +3 -1
- package/lib/cli/util/npm.d.ts +4 -1
- package/lib/cli/util/npm.js +25 -13
- package/lib/cli/version.d.ts +1 -1
- package/lib/cli/version.js +21 -25
- package/lib/commands/context.js +3 -2
- package/lib/commands/diff.d.ts +1 -50
- package/lib/commands/diff.js +5 -213
- package/lib/commands/init/init.js +3 -2
- package/lib/commands/list-stacks.js +4 -4
- package/lib/context-providers/ami.d.ts +1 -13
- package/lib/context-providers/ami.js +16 -48
- package/lib/context-providers/availability-zones.d.ts +1 -13
- package/lib/context-providers/availability-zones.js +16 -25
- package/lib/context-providers/cc-api-provider.d.ts +1 -30
- package/lib/context-providers/cc-api-provider.js +16 -136
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +1 -13
- package/lib/context-providers/endpoint-service-availability-zones.js +16 -31
- package/lib/context-providers/hosted-zones.d.ts +1 -12
- package/lib/context-providers/hosted-zones.js +16 -65
- package/lib/context-providers/index.d.ts +1 -44
- package/lib/context-providers/index.js +15 -126
- package/lib/context-providers/keys.d.ts +1 -13
- package/lib/context-providers/keys.js +16 -50
- package/lib/context-providers/load-balancers.d.ts +1 -20
- package/lib/context-providers/load-balancers.js +16 -154
- package/lib/context-providers/security-groups.d.ts +1 -9
- package/lib/context-providers/security-groups.js +16 -66
- package/lib/context-providers/ssm-parameters.d.ts +1 -25
- package/lib/context-providers/ssm-parameters.js +16 -57
- package/lib/context-providers/vpcs.d.ts +1 -13
- package/lib/context-providers/vpcs.js +16 -285
- package/lib/{api/cxapp → cxapp}/cloud-assembly.d.ts +3 -59
- package/lib/cxapp/cloud-assembly.js +108 -0
- package/lib/{api/cxapp → cxapp}/cloud-executable.d.ts +10 -3
- package/lib/cxapp/cloud-executable.js +92 -0
- package/lib/{api/cxapp → cxapp}/environments.d.ts +1 -2
- package/lib/{api/cxapp → cxapp}/environments.js +2 -2
- package/lib/cxapp/exec.d.ts +14 -0
- package/lib/cxapp/exec.js +157 -0
- package/lib/cxapp/index.d.ts +4 -0
- package/lib/{api/bootstrap → cxapp}/index.js +5 -3
- package/lib/index.js +134493 -125222
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init-templates/.recommended-feature-flags.json +3 -1
- package/lib/legacy-aws-auth.d.ts +74 -0
- package/lib/legacy-aws-auth.js +40 -0
- package/lib/legacy-exports-source.d.ts +13 -18
- package/lib/legacy-exports-source.js +42 -49
- package/lib/legacy-exports.d.ts +3 -6
- package/lib/legacy-exports.js +5 -5
- package/lib/legacy-types.d.ts +31 -0
- package/lib/legacy-types.js +3 -0
- package/package.json +19 -18
- package/lib/api/aws-auth/account-cache.d.ts +0 -36
- package/lib/api/aws-auth/account-cache.js +0 -99
- package/lib/api/aws-auth/awscli-compatible.d.ts +0 -42
- package/lib/api/aws-auth/awscli-compatible.js +0 -263
- package/lib/api/aws-auth/cached.d.ts +0 -11
- package/lib/api/aws-auth/cached.js +0 -26
- package/lib/api/aws-auth/credential-plugins.d.ts +0 -36
- package/lib/api/aws-auth/credential-plugins.js +0 -152
- package/lib/api/aws-auth/index.d.ts +0 -3
- package/lib/api/aws-auth/index.js +0 -20
- package/lib/api/aws-auth/provider-caching.d.ts +0 -13
- package/lib/api/aws-auth/provider-caching.js +0 -24
- package/lib/api/aws-auth/sdk-logger.d.ts +0 -69
- package/lib/api/aws-auth/sdk-logger.js +0 -124
- package/lib/api/aws-auth/sdk-provider.d.ts +0 -207
- package/lib/api/aws-auth/sdk-provider.js +0 -357
- package/lib/api/aws-auth/sdk.d.ts +0 -229
- package/lib/api/aws-auth/sdk.js +0 -373
- package/lib/api/aws-auth/tracing.d.ts +0 -11
- package/lib/api/aws-auth/tracing.js +0 -60
- package/lib/api/aws-auth/user-agent.d.ts +0 -7
- package/lib/api/aws-auth/user-agent.js +0 -20
- package/lib/api/aws-auth/util.d.ts +0 -6
- package/lib/api/aws-auth/util.js +0 -23
- package/lib/api/bootstrap/bootstrap-environment.d.ts +0 -35
- package/lib/api/bootstrap/bootstrap-environment.js +0 -321
- package/lib/api/bootstrap/bootstrap-props.d.ts +0 -130
- package/lib/api/bootstrap/bootstrap-props.js +0 -14
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +0 -39
- package/lib/api/bootstrap/deploy-bootstrap.js +0 -141
- package/lib/api/bootstrap/index.d.ts +0 -2
- package/lib/api/bootstrap/legacy-template.d.ts +0 -2
- package/lib/api/bootstrap/legacy-template.js +0 -82
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +0 -85
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +0 -440
- package/lib/api/cloudformation/index.d.ts +0 -4
- package/lib/api/cloudformation/index.js +0 -21
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +0 -25
- package/lib/api/cloudformation/nested-stack-helpers.js +0 -86
- package/lib/api/cloudformation/stack-helpers.d.ts +0 -96
- package/lib/api/cloudformation/stack-helpers.js +0 -158
- package/lib/api/cloudformation/template-body-parameter.d.ts +0 -22
- package/lib/api/cloudformation/template-body-parameter.js +0 -104
- package/lib/api/cxapp/cloud-assembly.js +0 -304
- package/lib/api/cxapp/cloud-executable.js +0 -89
- package/lib/api/cxapp/exec.d.ts +0 -56
- package/lib/api/cxapp/exec.js +0 -272
- package/lib/api/deployments/asset-manifest-builder.d.ts +0 -8
- package/lib/api/deployments/asset-manifest-builder.js +0 -35
- package/lib/api/deployments/asset-publishing.d.ts +0 -60
- package/lib/api/deployments/asset-publishing.js +0 -141
- package/lib/api/deployments/assets.d.ts +0 -11
- package/lib/api/deployments/assets.js +0 -109
- package/lib/api/deployments/cfn-api.d.ts +0 -138
- package/lib/api/deployments/cfn-api.js +0 -438
- package/lib/api/deployments/checks.d.ts +0 -9
- package/lib/api/deployments/checks.js +0 -72
- package/lib/api/deployments/deploy-stack.d.ts +0 -155
- package/lib/api/deployments/deploy-stack.js +0 -478
- package/lib/api/deployments/deployment-method.d.ts +0 -24
- package/lib/api/deployments/deployment-method.js +0 -3
- package/lib/api/deployments/deployment-result.d.ts +0 -21
- package/lib/api/deployments/deployment-result.js +0 -10
- package/lib/api/deployments/deployments.d.ts +0 -296
- package/lib/api/deployments/deployments.js +0 -331
- package/lib/api/deployments/hotswap-deployments.d.ts +0 -17
- package/lib/api/deployments/hotswap-deployments.js +0 -441
- package/lib/api/deployments/index.d.ts +0 -4
- package/lib/api/deployments/index.js +0 -21
- package/lib/api/environment/environment-access.d.ts +0 -140
- package/lib/api/environment/environment-access.js +0 -202
- package/lib/api/environment/environment-resources.d.ts +0 -75
- package/lib/api/environment/environment-resources.js +0 -207
- package/lib/api/environment/index.d.ts +0 -3
- package/lib/api/environment/index.js +0 -20
- package/lib/api/environment/placeholders.d.ts +0 -10
- package/lib/api/environment/placeholders.js +0 -23
- package/lib/api/garbage-collection/garbage-collector.d.ts +0 -158
- package/lib/api/garbage-collection/garbage-collector.js +0 -599
- package/lib/api/garbage-collection/index.d.ts +0 -1
- package/lib/api/garbage-collection/progress-printer.d.ts +0 -23
- package/lib/api/garbage-collection/progress-printer.js +0 -70
- package/lib/api/garbage-collection/stack-refresh.d.ts +0 -49
- package/lib/api/garbage-collection/stack-refresh.js +0 -151
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +0 -4
- package/lib/api/hotswap/appsync-mapping-templates.js +0 -162
- package/lib/api/hotswap/code-build-projects.d.ts +0 -4
- package/lib/api/hotswap/code-build-projects.js +0 -62
- package/lib/api/hotswap/common.d.ts +0 -89
- package/lib/api/hotswap/common.js +0 -128
- package/lib/api/hotswap/ecs-services.d.ts +0 -4
- package/lib/api/hotswap/ecs-services.js +0 -159
- package/lib/api/hotswap/lambda-functions.d.ts +0 -4
- package/lib/api/hotswap/lambda-functions.js +0 -297
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +0 -5
- package/lib/api/hotswap/s3-bucket-deployments.js +0 -117
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +0 -4
- package/lib/api/hotswap/stepfunctions-state-machines.js +0 -48
- package/lib/api/logs/find-cloudwatch-logs.d.ts +0 -25
- package/lib/api/logs/find-cloudwatch-logs.js +0 -95
- package/lib/api/logs/index.d.ts +0 -2
- package/lib/api/logs/logs-monitor.d.ts +0 -76
- package/lib/api/logs/logs-monitor.js +0 -187
- package/lib/api/plugin/context-provider-plugin.d.ts +0 -6
- package/lib/api/plugin/context-provider-plugin.js +0 -7
- package/lib/api/plugin/index.d.ts +0 -3
- package/lib/api/plugin/index.js +0 -20
- package/lib/api/plugin/mode.d.ts +0 -4
- package/lib/api/plugin/mode.js +0 -9
- package/lib/api/plugin/plugin.d.ts +0 -63
- package/lib/api/plugin/plugin.js +0 -102
- package/lib/api/resource-import/importer.d.ts +0 -220
- package/lib/api/resource-import/importer.js +0 -331
- package/lib/api/resource-import/index.d.ts +0 -2
- package/lib/api/resource-import/migrator.d.ts +0 -26
- package/lib/api/resource-import/migrator.js +0 -71
- package/lib/api/stack-events/index.d.ts +0 -3
- package/lib/api/stack-events/index.js +0 -20
- package/lib/api/stack-events/stack-activity-monitor.d.ts +0 -100
- package/lib/api/stack-events/stack-activity-monitor.js +0 -142
- package/lib/api/stack-events/stack-event-poller.d.ts +0 -69
- package/lib/api/stack-events/stack-event-poller.js +0 -128
- package/lib/api/stack-events/stack-progress-monitor.d.ts +0 -48
- package/lib/api/stack-events/stack-progress-monitor.js +0 -94
- package/lib/api/stack-events/stack-status.d.ts +0 -42
- package/lib/api/stack-events/stack-status.js +0 -88
- package/lib/api/util/rwlock.d.ts +0 -65
- package/lib/api/util/rwlock.js +0 -179
- package/lib/api/work-graph/index.d.ts +0 -3
- package/lib/api/work-graph/index.js +0 -20
- package/lib/api/work-graph/work-graph-builder.d.ts +0 -34
- package/lib/api/work-graph/work-graph-builder.js +0 -168
- package/lib/api/work-graph/work-graph-types.d.ts +0 -50
- package/lib/api/work-graph/work-graph-types.js +0 -13
- package/lib/api/work-graph/work-graph.d.ts +0 -72
- package/lib/api/work-graph/work-graph.js +0 -346
- package/lib/cli/activity-printer/base.d.ts +0 -50
- package/lib/cli/activity-printer/base.js +0 -114
- package/lib/cli/activity-printer/current.d.ts +0 -26
- package/lib/cli/activity-printer/current.js +0 -118
- package/lib/cli/activity-printer/display.d.ts +0 -13
- package/lib/cli/activity-printer/display.js +0 -80
- package/lib/cli/activity-printer/history.d.ts +0 -32
- package/lib/cli/activity-printer/history.js +0 -108
- package/lib/cli/activity-printer/index.d.ts +0 -3
- package/lib/cli/activity-printer/index.js +0 -20
- package/lib/notices.d.ts +0 -203
- package/lib/notices.js +0 -411
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ResourceImporter = void 0;
|
|
4
|
-
exports.removeNonImportResources = removeNonImportResources;
|
|
5
|
-
const util_1 = require("util");
|
|
6
|
-
const cfnDiff = require("@aws-cdk/cloudformation-diff");
|
|
7
|
-
const chalk = require("chalk");
|
|
8
|
-
const fs = require("fs-extra");
|
|
9
|
-
const promptly = require("promptly");
|
|
10
|
-
const api_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api");
|
|
11
|
-
const private_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
|
|
12
|
-
const deployments_1 = require("../deployments");
|
|
13
|
-
/**
|
|
14
|
-
* Resource importing utility class
|
|
15
|
-
*
|
|
16
|
-
* - Determines the resources added to a template (compared to the deployed version)
|
|
17
|
-
* - Look up the identification information
|
|
18
|
-
* - Load them from a file, or
|
|
19
|
-
* - Ask the user, based on information supplied to us by CloudFormation's GetTemplateSummary
|
|
20
|
-
* - Translate the input to a structure expected by CloudFormation, update the template to add the
|
|
21
|
-
* importable resources, then run an IMPORT changeset.
|
|
22
|
-
*/
|
|
23
|
-
class ResourceImporter {
|
|
24
|
-
constructor(stack, props) {
|
|
25
|
-
this.stack = stack;
|
|
26
|
-
this.cfn = props.deployments;
|
|
27
|
-
this.ioHelper = props.ioHelper;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Ask the user for resources to import
|
|
31
|
-
*/
|
|
32
|
-
async askForResourceIdentifiers(available) {
|
|
33
|
-
const ret = { importResources: [], resourceMap: {} };
|
|
34
|
-
const resourceIdentifiers = await this.resourceIdentifiers();
|
|
35
|
-
for (const resource of available) {
|
|
36
|
-
const identifier = await this.askForResourceIdentifier(resourceIdentifiers, resource);
|
|
37
|
-
if (!identifier) {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
ret.importResources.push(resource);
|
|
41
|
-
ret.resourceMap[resource.logicalId] = identifier;
|
|
42
|
-
}
|
|
43
|
-
return ret;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Load the resources to import from a file
|
|
47
|
-
*/
|
|
48
|
-
async loadResourceIdentifiers(available, filename) {
|
|
49
|
-
const contents = await fs.readJson(filename);
|
|
50
|
-
const ret = { importResources: [], resourceMap: {} };
|
|
51
|
-
for (const resource of available) {
|
|
52
|
-
const descr = this.describeResource(resource.logicalId);
|
|
53
|
-
const idProps = contents[resource.logicalId];
|
|
54
|
-
if (idProps) {
|
|
55
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg((0, util_1.format)('%s: importing using %s', chalk.blue(descr), chalk.blue(fmtdict(idProps)))));
|
|
56
|
-
ret.importResources.push(resource);
|
|
57
|
-
ret.resourceMap[resource.logicalId] = idProps;
|
|
58
|
-
delete contents[resource.logicalId];
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg((0, util_1.format)('%s: skipping', chalk.blue(descr))));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const unknown = Object.keys(contents);
|
|
65
|
-
if (unknown.length > 0) {
|
|
66
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Unrecognized resource identifiers in mapping file: ${unknown.join(', ')}`));
|
|
67
|
-
}
|
|
68
|
-
return ret;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Based on the provided resource mapping, prepare CFN structures for import (template,
|
|
72
|
-
* ResourcesToImport structure) and perform the import operation (CloudFormation deployment)
|
|
73
|
-
*
|
|
74
|
-
* @param importMap Mapping from CDK construct tree path to physical resource import identifiers
|
|
75
|
-
* @param options Options to pass to CloudFormation deploy operation
|
|
76
|
-
*/
|
|
77
|
-
async importResourcesFromMap(importMap, options = {}) {
|
|
78
|
-
const resourcesToImport = await this.makeResourcesToImport(importMap);
|
|
79
|
-
const updatedTemplate = await this.currentTemplateWithAdditions(importMap.importResources);
|
|
80
|
-
await this.importResources(updatedTemplate, resourcesToImport, options);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Based on the app and resources file generated by cdk migrate. Removes all items from the template that
|
|
84
|
-
* cannot be included in an import change-set for new stacks and performs the import operation,
|
|
85
|
-
* creating the new stack.
|
|
86
|
-
*
|
|
87
|
-
* @param resourcesToImport The mapping created by cdk migrate
|
|
88
|
-
* @param options Options to pass to CloudFormation deploy operation
|
|
89
|
-
*/
|
|
90
|
-
async importResourcesFromMigrate(resourcesToImport, options = {}) {
|
|
91
|
-
const updatedTemplate = this.removeNonImportResources();
|
|
92
|
-
await this.importResources(updatedTemplate, resourcesToImport, options);
|
|
93
|
-
}
|
|
94
|
-
async importResources(overrideTemplate, resourcesToImport, options) {
|
|
95
|
-
try {
|
|
96
|
-
const result = await this.cfn.deployStack({
|
|
97
|
-
stack: this.stack,
|
|
98
|
-
deployName: this.stack.stackName,
|
|
99
|
-
...options,
|
|
100
|
-
overrideTemplate,
|
|
101
|
-
resourcesToImport,
|
|
102
|
-
});
|
|
103
|
-
(0, deployments_1.assertIsSuccessfulDeployStackResult)(result);
|
|
104
|
-
const message = result.noOp
|
|
105
|
-
? ' ✅ %s (no changes)'
|
|
106
|
-
: ' ✅ %s';
|
|
107
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg('\n' + chalk.green((0, util_1.format)(message, this.stack.displayName))));
|
|
108
|
-
}
|
|
109
|
-
catch (e) {
|
|
110
|
-
await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_E3900.msg((0, util_1.format)('\n ❌ %s failed: %s', chalk.bold(this.stack.displayName), e), { error: e }));
|
|
111
|
-
throw e;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Perform a diff between the currently running and the new template, ensure that it is valid
|
|
116
|
-
* for importing and return a list of resources that are being added in the new version
|
|
117
|
-
*
|
|
118
|
-
* @return mapping logicalResourceId -> resourceDifference
|
|
119
|
-
*/
|
|
120
|
-
async discoverImportableResources(allowNonAdditions = false) {
|
|
121
|
-
const currentTemplate = await this.currentTemplate();
|
|
122
|
-
const diff = cfnDiff.fullDiff(currentTemplate, this.stack.template);
|
|
123
|
-
// Ignore changes to CDKMetadata
|
|
124
|
-
const resourceChanges = Object.entries(diff.resources.changes)
|
|
125
|
-
.filter(([logicalId, _]) => logicalId !== 'CDKMetadata');
|
|
126
|
-
// Split the changes into additions and non-additions. Imports only make sense
|
|
127
|
-
// for newly-added resources.
|
|
128
|
-
const nonAdditions = resourceChanges.filter(([_, dif]) => !dif.isAddition);
|
|
129
|
-
const additions = resourceChanges.filter(([_, dif]) => dif.isAddition);
|
|
130
|
-
if (nonAdditions.length) {
|
|
131
|
-
const offendingResources = nonAdditions.map(([logId, _]) => this.describeResource(logId));
|
|
132
|
-
if (allowNonAdditions) {
|
|
133
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Ignoring updated/deleted resources (--force): ${offendingResources.join(', ')}`));
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
throw new api_1.ToolkitError('No resource updates or deletes are allowed on import operation. Make sure to resolve pending changes ' +
|
|
137
|
-
`to existing resources, before attempting an import. Updated/deleted resources: ${offendingResources.join(', ')} (--force to override)`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
// Resources in the new template, that are not present in the current template, are a potential import candidates
|
|
141
|
-
return {
|
|
142
|
-
additions: additions.map(([logicalId, resourceDiff]) => ({
|
|
143
|
-
logicalId,
|
|
144
|
-
resourceDiff,
|
|
145
|
-
resourceDefinition: addDefaultDeletionPolicy(this.stack.template?.Resources?.[logicalId] ?? {}),
|
|
146
|
-
})),
|
|
147
|
-
hasNonAdditions: nonAdditions.length > 0,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Resolves the environment of a stack.
|
|
152
|
-
*/
|
|
153
|
-
async resolveEnvironment() {
|
|
154
|
-
return this.cfn.resolveEnvironment(this.stack);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Get currently deployed template of the given stack (SINGLETON)
|
|
158
|
-
*
|
|
159
|
-
* @returns Currently deployed CloudFormation template
|
|
160
|
-
*/
|
|
161
|
-
async currentTemplate() {
|
|
162
|
-
if (!this._currentTemplate) {
|
|
163
|
-
this._currentTemplate = await this.cfn.readCurrentTemplate(this.stack);
|
|
164
|
-
}
|
|
165
|
-
return this._currentTemplate;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Return the current template, with the given resources added to it
|
|
169
|
-
*/
|
|
170
|
-
async currentTemplateWithAdditions(additions) {
|
|
171
|
-
const template = await this.currentTemplate();
|
|
172
|
-
if (!template.Resources) {
|
|
173
|
-
template.Resources = {};
|
|
174
|
-
}
|
|
175
|
-
for (const add of additions) {
|
|
176
|
-
template.Resources[add.logicalId] = add.resourceDefinition;
|
|
177
|
-
}
|
|
178
|
-
return template;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Get a list of import identifiers for all resource types used in the given
|
|
182
|
-
* template that do support the import operation (SINGLETON)
|
|
183
|
-
*
|
|
184
|
-
* @returns a mapping from a resource type to a list of property names that together identify the resource for import
|
|
185
|
-
*/
|
|
186
|
-
async resourceIdentifiers() {
|
|
187
|
-
const ret = {};
|
|
188
|
-
const resourceIdentifierSummaries = await this.cfn.resourceIdentifierSummaries(this.stack);
|
|
189
|
-
for (const summary of resourceIdentifierSummaries) {
|
|
190
|
-
if ('ResourceType' in summary && summary.ResourceType && 'ResourceIdentifiers' in summary && summary.ResourceIdentifiers) {
|
|
191
|
-
ret[summary.ResourceType] = (summary.ResourceIdentifiers ?? [])?.map(x => x.split(','));
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return ret;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Ask for the importable identifier for the given resource
|
|
198
|
-
*
|
|
199
|
-
* There may be more than one identifier under which a resource can be imported. The `import`
|
|
200
|
-
* operation needs exactly one of them.
|
|
201
|
-
*
|
|
202
|
-
* - If we can get one from the template, we will use one.
|
|
203
|
-
* - Otherwise, we will ask the user for one of them.
|
|
204
|
-
*/
|
|
205
|
-
async askForResourceIdentifier(resourceIdentifiers, chg) {
|
|
206
|
-
const resourceName = this.describeResource(chg.logicalId);
|
|
207
|
-
// Skip resources that do not support importing
|
|
208
|
-
const resourceType = chg.resourceDiff.newResourceType;
|
|
209
|
-
if (resourceType === undefined || !(resourceType in resourceIdentifiers)) {
|
|
210
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`${resourceName}: unsupported resource type ${resourceType}, skipping import.`));
|
|
211
|
-
return undefined;
|
|
212
|
-
}
|
|
213
|
-
const idPropSets = resourceIdentifiers[resourceType];
|
|
214
|
-
// Retain only literal strings: strip potential CFN intrinsics
|
|
215
|
-
const resourceProps = Object.fromEntries(Object.entries(chg.resourceDefinition.Properties ?? {})
|
|
216
|
-
.filter(([_, v]) => typeof v === 'string'));
|
|
217
|
-
// Find property sets that are fully satisfied in the template, ask the user to confirm them
|
|
218
|
-
const satisfiedPropSets = idPropSets.filter(ps => ps.every(p => resourceProps[p]));
|
|
219
|
-
for (const satisfiedPropSet of satisfiedPropSets) {
|
|
220
|
-
const candidateProps = Object.fromEntries(satisfiedPropSet.map(p => [p, resourceProps[p]]));
|
|
221
|
-
const displayCandidateProps = fmtdict(candidateProps);
|
|
222
|
-
if (await promptly.confirm(`${chalk.blue(resourceName)} (${resourceType}): import with ${chalk.yellow(displayCandidateProps)} (yes/no) [default: yes]? `, { default: 'yes' })) {
|
|
223
|
-
return candidateProps;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
// If we got here and the user rejected any available identifiers, then apparently they don't want the resource at all
|
|
227
|
-
if (satisfiedPropSets.length > 0) {
|
|
228
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.grey(`Skipping import of ${resourceName}`)));
|
|
229
|
-
return undefined;
|
|
230
|
-
}
|
|
231
|
-
// We cannot auto-import this, ask the user for one of the props
|
|
232
|
-
// The only difference between these cases is what we print: for multiple properties, we print a preamble
|
|
233
|
-
const prefix = `${chalk.blue(resourceName)} (${resourceType})`;
|
|
234
|
-
let preamble;
|
|
235
|
-
let promptPattern;
|
|
236
|
-
if (idPropSets.length > 1) {
|
|
237
|
-
preamble = `${prefix}: enter one of ${idPropSets.map(x => chalk.blue(x.join('+'))).join(', ')} to import (all empty to skip)`;
|
|
238
|
-
promptPattern = `${prefix}: enter %`;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
promptPattern = `${prefix}: enter %`;
|
|
242
|
-
}
|
|
243
|
-
// Do the input loop here
|
|
244
|
-
if (preamble) {
|
|
245
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(preamble));
|
|
246
|
-
}
|
|
247
|
-
for (const idProps of idPropSets) {
|
|
248
|
-
const input = {};
|
|
249
|
-
for (const idProp of idProps) {
|
|
250
|
-
// If we have a value from the template, use it as default. This will only be a partial
|
|
251
|
-
// identifier if present, otherwise we would have done the import already above.
|
|
252
|
-
const defaultValue = resourceProps[idProp] ?? '';
|
|
253
|
-
const prompt = [
|
|
254
|
-
promptPattern.replace(/%/g, chalk.blue(idProp)),
|
|
255
|
-
defaultValue
|
|
256
|
-
? `[${defaultValue}]`
|
|
257
|
-
: '(empty to skip)',
|
|
258
|
-
].join(' ') + ':';
|
|
259
|
-
const response = await promptly.prompt(prompt, { default: defaultValue, trim: true });
|
|
260
|
-
if (!response) {
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
input[idProp] = response;
|
|
264
|
-
// Also stick this property into 'resourceProps', so that it may be reused by a subsequent question
|
|
265
|
-
// (for a different compound identifier that involves the same property). Just a small UX enhancement.
|
|
266
|
-
resourceProps[idProp] = response;
|
|
267
|
-
}
|
|
268
|
-
// If the user gave inputs for all values, we are complete
|
|
269
|
-
if (Object.keys(input).length === idProps.length) {
|
|
270
|
-
return input;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.grey(`Skipping import of ${resourceName}`)));
|
|
274
|
-
return undefined;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Convert the internal "resource mapping" structure to CloudFormation accepted "ResourcesToImport" structure
|
|
278
|
-
*/
|
|
279
|
-
async makeResourcesToImport(resourceMap) {
|
|
280
|
-
return resourceMap.importResources.map(res => ({
|
|
281
|
-
LogicalResourceId: res.logicalId,
|
|
282
|
-
ResourceType: res.resourceDiff.newResourceType,
|
|
283
|
-
ResourceIdentifier: resourceMap.resourceMap[res.logicalId],
|
|
284
|
-
}));
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Convert CloudFormation logical resource ID to CDK construct tree path
|
|
288
|
-
*
|
|
289
|
-
* @param logicalId CloudFormation logical ID of the resource (the key in the template's Resources section)
|
|
290
|
-
* @returns Forward-slash separated path of the resource in CDK construct tree, e.g. MyStack/MyBucket/Resource
|
|
291
|
-
*/
|
|
292
|
-
describeResource(logicalId) {
|
|
293
|
-
return this.stack.template?.Resources?.[logicalId]?.Metadata?.['aws:cdk:path'] ?? logicalId;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Removes CDKMetadata and Outputs in the template so that only resources for importing are left.
|
|
297
|
-
* @returns template with import resources only
|
|
298
|
-
*/
|
|
299
|
-
removeNonImportResources() {
|
|
300
|
-
return removeNonImportResources(this.stack);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
exports.ResourceImporter = ResourceImporter;
|
|
304
|
-
/**
|
|
305
|
-
* Removes CDKMetadata and Outputs in the template so that only resources for importing are left.
|
|
306
|
-
* @returns template with import resources only
|
|
307
|
-
*/
|
|
308
|
-
function removeNonImportResources(stack) {
|
|
309
|
-
const template = stack.template;
|
|
310
|
-
delete template.Resources.CDKMetadata;
|
|
311
|
-
delete template.Outputs;
|
|
312
|
-
return template;
|
|
313
|
-
}
|
|
314
|
-
function fmtdict(xs) {
|
|
315
|
-
return Object.entries(xs).map(([k, v]) => `${k}=${v}`).join(', ');
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Add a default `DeletionPolicy` policy.
|
|
319
|
-
* The default value is set to 'Retain', to lower risk of unintentionally
|
|
320
|
-
* deleting stateful resources in the process of importing to CDK.
|
|
321
|
-
*/
|
|
322
|
-
function addDefaultDeletionPolicy(resource) {
|
|
323
|
-
if (resource.DeletionPolicy) {
|
|
324
|
-
return resource;
|
|
325
|
-
}
|
|
326
|
-
return {
|
|
327
|
-
...resource,
|
|
328
|
-
DeletionPolicy: 'Retain',
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpY0EsNERBS0M7QUF0Y0QsK0JBQThCO0FBQzlCLHdEQUF3RDtBQUl4RCwrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLHFDQUFxQztBQUNyQywwRUFBZ0Y7QUFDaEYseUZBQWdHO0FBRWhHLGdEQUFxRTtBQW1GckU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFPM0IsWUFDRSxLQUF3QyxFQUN4QyxLQUE0QjtRQUU1QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxTQUErQjtRQUNwRSxNQUFNLEdBQUcsR0FBYyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUU3RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsU0FBUztZQUNYLENBQUM7WUFFRCxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDbkQsQ0FBQztRQUVELE9BQU8sR0FBRyxD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LENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsd0JBQXdCLENBQUMsUUFBYTtJQUM3QyxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLGNBQWMsRUFBRSxRQUFRO0tBQ3pCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBjZm5EaWZmIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZURpZmZlcmVuY2UgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyeSwgUmVzb3VyY2VUb0ltcG9ydCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwcm9tcHRseSBmcm9tICdwcm9tcHRseSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi8uLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGknO1xuaW1wb3J0IHsgSU8sIHR5cGUgSW9IZWxwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9AYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzL3NyYy9hcGkvaW8vcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IERlcGxveW1lbnRNZXRob2QsIERlcGxveW1lbnRzIH0gZnJvbSAnLi4vZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgYXNzZXJ0SXNTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfSBmcm9tICcuLi9kZXBsb3ltZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gJy4uL3RhZ3MnO1xuXG5leHBvcnQgdHlwZSBSZXNvdXJjZXNUb0ltcG9ydCA9IFJlc291cmNlVG9JbXBvcnRbXTtcbmV4cG9ydCB0eXBlIFJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcyA9IFJlc291cmNlSWRlbnRpZmllclN1bW1hcnlbXTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUltcG9ydGVyUHJvcHMge1xuICBkZXBsb3ltZW50czogRGVwbG95bWVudHM7XG4gIGlvSGVscGVyOiBJb0hlbHBlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbXBvcnREZXBsb3ltZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSb2xlIHRvIHBhc3MgdG8gQ2xvdWRGb3JtYXRpb24gZm9yIGRlcGxveW1lbnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IHN0YWNrIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgbWV0aG9kXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ2hhbmdlIHNldCB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZD86IERlcGxveW1lbnRNZXRob2Q7XG5cbiAgLyoqXG4gICAqIFN0YWNrIHRhZ3MgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogVGFnW107XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU2V0IG9mIHBhcmFtZXRlcnMgdGhhdCB1bmlxdWVseSBpZGVudGlmeSBhIHBoeXNpY2FsIHJlc291cmNlIG9mIGEgZ2l2ZW4gdHlwZVxuICogZm9yIHRoZSBpbXBvcnQgb3BlcmF0aW9uLCBleGFtcGxlOlxuICpcbiAqIGBgYFxuICoge1xuICogICBcIkFXUzo6UzM6OkJ1Y2tldFwiOiBbW1wiQnVja2V0TmFtZVwiXV0sXG4gKiAgIFwiQVdTOjpEeW5hbW9EQjo6R2xvYmFsVGFibGVcIjogW1tcIlRhYmxlTmFtZVwiXSwgW1wiVGFibGVBcm5cIl0sIFtcIlRhYmxlU3RyZWFtQXJuXCJdXSxcbiAqICAgXCJBV1M6OlJvdXRlNTM6OktleVNpZ25pbmdLZXlcIjogW1tcIkhvc3RlZFpvbmVJZFwiLCBcIk5hbWVcIl1dLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFJlc291cmNlSWRlbnRpZmllcnMgPSB7IFtyZXNvdXJjZVR5cGU6IHN0cmluZ106IHN0cmluZ1tdW10gfTtcblxudHlwZSBSZXNvdXJjZUlkZW50aWZpZXJQcm9wZXJ0aWVzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIENESyByZXNvdXJjZXMgKEwxIGNvbnN0cnVjdHMpIHRvIHBoeXNpY2FsIHJlc291cmNlcyB0byBiZSBpbXBvcnRlZFxuICogaW4gdGhlaXIgcGxhY2UsIGV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiB7XG4gKiAgIFwiTXlTdGFjay9NeVMzQnVja2V0L1Jlc291cmNlXCI6IHtcbiAqICAgICBcIkJ1Y2tldE5hbWVcIjogXCJteS1tYW51YWxseS1jcmVhdGVkLXMzLWJ1Y2tldFwiXG4gKiAgIH0sXG4gKiAgIFwiTXlTdGFjay9NeVZwYy9SZXNvdXJjZVwiOiB7XG4gKiAgICAgXCJWcGNJZFwiOiBcInZwYy0xMjM0NTY3ODlcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xudHlwZSBSZXNvdXJjZU1hcCA9IHsgW2xvZ2ljYWxSZXNvdXJjZTogc3RyaW5nXTogUmVzb3VyY2VJZGVudGlmaWVyUHJvcGVydGllcyB9O1xuXG4vKipcbiAqIFJlc291cmNlIGltcG9ydGluZyB1dGlsaXR5IGNsYXNzXG4gKlxuICogLSBEZXRlcm1pbmVzIHRoZSByZXNvdXJjZXMgYWRkZWQgdG8gYSB0ZW1wbGF0ZSAoY29tcGFyZWQgdG8gdGhlIGRlcGxveWVkIHZlcnNpb24pXG4gKiAtIExvb2sgdXAgdGhlIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uXG4gKiAgIC0gTG9hZCB0aGVtIGZyb20gYSBmaWxlLCBvclxuICogICAtIEFzayB0aGUgdXNlciwgYmFzZWQgb24gaW5mb3JtYXRpb24gc3VwcGxpZWQgdG8gdXMgYnkgQ2xvdWRGb3JtYXRpb24ncyBHZXRUZW1wbGF0ZVN1bW1hcnlcbiAqIC0gVHJhbnNsYXRlIHRoZSBpbnB1dCB0byBhIHN0cnVjdHVyZSBleHBlY3RlZCBieSBDbG91ZEZvcm1hdGlvbiwgdXBkYXRlIHRoZSB0ZW1wbGF0ZSB0byBhZGQgdGhlXG4gKiAgIGltcG9ydGFibGUgcmVzb3VyY2VzLCB0aGVuIHJ1biBhbiBJTVBPUlQgY2hhbmdlc2V0LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VJbXBvcnRlciB7XG4gIHByaXZhdGUgX2N1cnJlbnRUZW1wbGF0ZTogYW55O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBjZm46IERlcGxveW1lbnRzO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHByb3BzOiBSZXNvdXJjZUltcG9ydGVyUHJvcHMsXG4gICkge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLmNmbiA9IHByb3BzLmRlcGxveW1lbnRzO1xuICAgIHRoaXMuaW9IZWxwZXIgPSBwcm9wcy5pb0hlbHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgdGhlIHVzZXIgZm9yIHJlc291cmNlcyB0byBpbXBvcnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc2tGb3JSZXNvdXJjZUlkZW50aWZpZXJzKGF2YWlsYWJsZTogSW1wb3J0YWJsZVJlc291cmNlW10pOiBQcm9taXNlPEltcG9ydE1hcD4ge1xuICAgIGNvbnN0IHJldDogSW1wb3J0TWFwID0geyBpbXBvcnRSZXNvdXJjZXM6IFtdLCByZXNvdXJjZU1hcDoge30gfTtcbiAgICBjb25zdCByZXNvdXJjZUlkZW50aWZpZXJzID0gYXdhaXQgdGhpcy5yZXNvdXJjZUlkZW50aWZpZXJzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGF3YWl0IHRoaXMuYXNrRm9yUmVzb3VyY2VJZGVudGlmaWVyKHJlc291cmNlSWRlbnRpZmllcnMsIHJlc291cmNlKTtcbiAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0LmltcG9ydFJlc291cmNlcy5wdXNoKHJlc291cmNlKTtcbiAgICAgIHJldC5yZXNvdXJjZU1hcFtyZXNvdXJjZS5sb2dpY2FsSWRdID0gaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHJlc291cmNlcyB0byBpbXBvcnQgZnJvbSBhIGZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkUmVzb3VyY2VJZGVudGlmaWVycyhhdmFpbGFibGU6IEltcG9ydGFibGVSZXNvdXJjZVtdLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxJbXBvcnRNYXA+IHtcbiAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRKc29uKGZpbGVuYW1lKTtcblxuICAgIGNvbnN0IHJldDogSW1wb3J0TWFwID0geyBpbXBvcnRSZXNvdXJjZXM6IFtdLCByZXNvdXJjZU1hcDoge30gfTtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgZGVzY3IgPSB0aGlzLmRlc2NyaWJlUmVzb3VyY2UocmVzb3VyY2UubG9naWNhbElkKTtcbiAgICAgIGNvbnN0IGlkUHJvcHMgPSBjb250ZW50c1tyZXNvdXJjZS5sb2dpY2FsSWRdO1xuICAgICAgaWYgKGlkUHJvcHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0lORk8ubXNnKGZvcm1hdCgnJXM6IGltcG9ydGluZyB1c2luZyAlcycsIGNoYWxrLmJsdWUoZGVzY3IpLCBjaGFsay5ibHVlKGZtdGRpY3QoaWRQcm9wcykpKSkpO1xuXG4gICAgICAgIHJldC5pbXBvcnRSZXNvdXJjZXMucHVzaChyZXNvdXJjZSk7XG4gICAgICAgIHJldC5yZXNvdXJjZU1hcFtyZXNvdXJjZS5sb2dpY2FsSWRdID0gaWRQcm9wcztcbiAgICAgICAgZGVsZXRlIGNvbnRlbnRzW3Jlc291cmNlLmxvZ2ljYWxJZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coZm9ybWF0KCclczogc2tpcHBpbmcnLCBjaGFsay5ibHVlKGRlc2NyKSkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1bmtub3duID0gT2JqZWN0LmtleXMoY29udGVudHMpO1xuICAgIGlmICh1bmtub3duLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9XQVJOLm1zZyhgVW5yZWNvZ25pemVkIHJlc291cmNlIGlkZW50aWZpZXJzIGluIG1hcHBpbmcgZmlsZTogJHt1bmtub3duLmpvaW4oJywgJyl9YCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogQmFzZWQgb24gdGhlIHByb3ZpZGVkIHJlc291cmNlIG1hcHBpbmcsIHByZXBhcmUgQ0ZOIHN0cnVjdHVyZXMgZm9yIGltcG9ydCAodGVtcGxhdGUsXG4gICAqIFJlc291cmNlc1RvSW1wb3J0IHN0cnVjdHVyZSkgYW5kIHBlcmZvcm0gdGhlIGltcG9ydCBvcGVyYXRpb24gKENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnQpXG4gICAqXG4gICAqIEBwYXJhbSBpbXBvcnRNYXAgTWFwcGluZyBmcm9tIENESyBjb25zdHJ1Y3QgdHJlZSBwYXRoIHRvIHBoeXNpY2FsIHJlc291cmNlIGltcG9ydCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gQ2xvdWRGb3JtYXRpb24gZGVwbG95IG9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydFJlc291cmNlc0Zyb21NYXAoaW1wb3J0TWFwOiBJbXBvcnRNYXAsIG9wdGlvbnM6IEltcG9ydERlcGxveW1lbnRPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByZXNvdXJjZXNUb0ltcG9ydDogUmVzb3VyY2VzVG9JbXBvcnQgPSBhd2FpdCB0aGlzLm1ha2VSZXNvdXJjZXNUb0ltcG9ydChpbXBvcnRNYXApO1xuICAgIGNvbnN0IHVwZGF0ZWRUZW1wbGF0ZSA9IGF3YWl0IHRoaXMuY3VycmVudFRlbXBsYXRlV2l0aEFkZGl0aW9ucyhpbXBvcnRNYXAuaW1wb3J0UmVzb3VyY2VzKTtcblxuICAgIGF3YWl0IHRoaXMuaW1wb3J0UmVzb3VyY2VzKHVwZGF0ZWRUZW1wbGF0ZSwgcmVzb3VyY2VzVG9JbXBvcnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhc2VkIG9uIHRoZSBhcHAgYW5kIHJlc291cmNlcyBmaWxlIGdlbmVyYXRlZCBieSBjZGsgbWlncmF0ZS4gUmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSB0aGUgdGVtcGxhdGUgdGhhdFxuICAgKiBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gYW4gaW1wb3J0IGNoYW5nZS1zZXQgZm9yIG5ldyBzdGFja3MgYW5kIHBlcmZvcm1zIHRoZSBpbXBvcnQgb3BlcmF0aW9uLFxuICAgKiBjcmVhdGluZyB0aGUgbmV3IHN0YWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzVG9JbXBvcnQgVGhlIG1hcHBpbmcgY3JlYXRlZCBieSBjZGsgbWlncmF0ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gQ2xvdWRGb3JtYXRpb24gZGVwbG95IG9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydFJlc291cmNlc0Zyb21NaWdyYXRlKHJlc291cmNlc1RvSW1wb3J0OiBSZXNvdXJjZXNUb0ltcG9ydCwgb3B0aW9uczogSW1wb3J0RGVwbG95bWVudE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHVwZGF0ZWRUZW1wbGF0ZSA9IHRoaXMucmVtb3ZlTm9uSW1wb3J0UmVzb3VyY2VzKCk7XG5cbiAgICBhd2FpdCB0aGlzLmltcG9ydFJlc291cmNlcyh1cGRhdGVkVGVtcGxhdGUsIHJlc291cmNlc1RvSW1wb3J0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0UmVzb3VyY2VzKG92ZXJyaWRlVGVtcGxhdGU6IGFueSwgcmVzb3VyY2VzVG9JbXBvcnQ6IFJlc291cmNlc1RvSW1wb3J0LCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNmbi5kZXBsb3lTdGFjayh7XG4gICAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgICBkZXBsb3lOYW1lOiB0aGlzLnN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgb3ZlcnJpZGVUZW1wbGF0ZSxcbiAgICAgICAgcmVzb3VyY2VzVG9JbXBvcnQsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0SXNTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQocmVzdWx0KTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC5ub09wXG4gICAgICAgID8gJyDinIUgICVzIChubyBjaGFuZ2VzKSdcbiAgICAgICAgOiAnIOKchSAgJXMnO1xuXG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coJ1xcbicgKyBjaGFsay5ncmVlbihmb3JtYXQobWVzc2FnZSwgdGhpcy5zdGFjay5kaXNwbGF5TmFtZSkpKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTM5MDAubXNnKGZvcm1hdCgnXFxuIOKdjCAgJXMgZmFpbGVkOiAlcycsIGNoYWxrLmJvbGQodGhpcy5zdGFjay5kaXNwbGF5TmFtZSksIGUpLCB7IGVycm9yOiBlIGFzIGFueSB9KSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgZGlmZiBiZXR3ZWVuIHRoZSBjdXJyZW50bHkgcnVubmluZyBhbmQgdGhlIG5ldyB0ZW1wbGF0ZSwgZW5zdXJlIHRoYXQgaXQgaXMgdmFsaWRcbiAgICogZm9yIGltcG9ydGluZyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgYWRkZWQgaW4gdGhlIG5ldyB2ZXJzaW9uXG4gICAqXG4gICAqIEByZXR1cm4gbWFwcGluZyBsb2dpY2FsUmVzb3VyY2VJZCAtPiByZXNvdXJjZURpZmZlcmVuY2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNjb3ZlckltcG9ydGFibGVSZXNvdXJjZXMoYWxsb3dOb25BZGRpdGlvbnMgPSBmYWxzZSk6IFByb21pc2U8RGlzY292ZXJJbXBvcnRhYmxlUmVzb3VyY2VzUmVzdWx0PiB7XG4gICAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gYXdhaXQgdGhpcy5jdXJyZW50VGVtcGxhdGUoKTtcblxuICAgIGNvbnN0IGRpZmYgPSBjZm5EaWZmLmZ1bGxEaWZmKGN1cnJlbnRUZW1wbGF0ZSwgdGhpcy5zdGFjay50ZW1wbGF0ZSk7XG5cbiAgICAvLyBJZ25vcmUgY2hhbmdlcyB0byBDREtNZXRhZGF0YVxuICAgIGNvbnN0IHJlc291cmNlQ2hhbmdlcyA9IE9iamVjdC5lbnRyaWVzKGRpZmYucmVzb3VyY2VzLmNoYW5nZXMpXG4gICAgICAuZmlsdGVyKChbbG9naWNhbElkLCBfXSkgPT4gbG9naWNhbElkICE9PSAnQ0RLTWV0YWRhdGEnKTtcblxuICAgIC8vIFNwbGl0IHRoZSBjaGFuZ2VzIGludG8gYWRkaXRpb25zIGFuZCBub24tYWRkaXRpb25zLiBJbXBvcnRzIG9ubHkgbWFrZSBzZW5zZVxuICAgIC8vIGZvciBuZXdseS1hZGRlZCByZXNvdXJjZXMuXG4gICAgY29uc3Qgbm9uQWRkaXRpb25zID0gcmVzb3VyY2VDaGFuZ2VzLmZpbHRlcigoW18sIGRpZl0pID0+ICFkaWYuaXNBZGRpdGlvbik7XG4gICAgY29uc3QgYWRkaXRpb25zID0gcmVzb3VyY2VDaGFuZ2VzLmZpbHRlcigoW18sIGRpZl0pID0+IGRpZi5pc0FkZGl0aW9uKTtcblxuICAgIGlmIChub25BZGRpdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvZmZlbmRpbmdSZXNvdXJjZXMgPSBub25BZGRpdGlvbnMubWFwKChbbG9nSWQsIF9dKSA9PiB0aGlzLmRlc2NyaWJlUmVzb3VyY2UobG9nSWQpKTtcblxuICAgICAgaWYgKGFsbG93Tm9uQWRkaXRpb25zKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9XQVJOLm1zZyhgSWdub3JpbmcgdXBkYXRlZC9kZWxldGVkIHJlc291cmNlcyAoLS1mb3JjZSk6ICR7b2ZmZW5kaW5nUmVzb3VyY2VzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignTm8gcmVzb3VyY2UgdXBkYXRlcyBvciBkZWxldGVzIGFyZSBhbGxvd2VkIG9uIGltcG9ydCBvcGVyYXRpb24uIE1ha2Ugc3VyZSB0byByZXNvbHZlIHBlbmRpbmcgY2hhbmdlcyAnICtcbiAgICAgICAgICBgdG8gZXhpc3RpbmcgcmVzb3VyY2VzLCBiZWZvcmUgYXR0ZW1wdGluZyBhbiBpbXBvcnQuIFVwZGF0ZWQvZGVsZXRlZCByZXNvdXJjZXM6ICR7b2ZmZW5kaW5nUmVzb3VyY2VzLmpvaW4oJywgJyl9ICgtLWZvcmNlIHRvIG92ZXJyaWRlKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc291cmNlcyBpbiB0aGUgbmV3IHRlbXBsYXRlLCB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgY3VycmVudCB0ZW1wbGF0ZSwgYXJlIGEgcG90ZW50aWFsIGltcG9ydCBjYW5kaWRhdGVzXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZGl0aW9uczogYWRkaXRpb25zLm1hcCgoW2xvZ2ljYWxJZCwgcmVzb3VyY2VEaWZmXSkgPT4gKHtcbiAgICAgICAgbG9naWNhbElkLFxuICAgICAgICByZXNvdXJjZURpZmYsXG4gICAgICAgIHJlc291cmNlRGVmaW5pdGlvbjogYWRkRGVmYXVsdERlbGV0aW9uUG9saWN5KHRoaXMuc3RhY2sudGVtcGxhdGU/LlJlc291cmNlcz8uW2xvZ2ljYWxJZF0gPz8ge30pLFxuICAgICAgfSkpLFxuICAgICAgaGFzTm9uQWRkaXRpb25zOiBub25BZGRpdGlvbnMubGVuZ3RoID4gMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBlbnZpcm9ubWVudCBvZiBhIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc29sdmVFbnZpcm9ubWVudCgpOiBQcm9taXNlPGN4YXBpLkVudmlyb25tZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY2ZuLnJlc29sdmVFbnZpcm9ubWVudCh0aGlzLnN0YWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudGx5IGRlcGxveWVkIHRlbXBsYXRlIG9mIHRoZSBnaXZlbiBzdGFjayAoU0lOR0xFVE9OKVxuICAgKlxuICAgKiBAcmV0dXJucyBDdXJyZW50bHkgZGVwbG95ZWQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3VycmVudFRlbXBsYXRlKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLl9jdXJyZW50VGVtcGxhdGUpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRUZW1wbGF0ZSA9IGF3YWl0IHRoaXMuY2ZuLnJlYWRDdXJyZW50VGVtcGxhdGUodGhpcy5zdGFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VGVtcGxhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHRlbXBsYXRlLCB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZXMgYWRkZWQgdG8gaXRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3VycmVudFRlbXBsYXRlV2l0aEFkZGl0aW9ucyhhZGRpdGlvbnM6IEltcG9ydGFibGVSZXNvdXJjZVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMuY3VycmVudFRlbXBsYXRlKCk7XG4gICAgaWYgKCF0ZW1wbGF0ZS5SZXNvdXJjZXMpIHtcbiAgICAgIHRlbXBsYXRlLlJlc291cmNlcyA9IHt9O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWRkIG9mIGFkZGl0aW9ucykge1xuICAgICAgdGVtcGxhdGUuUmVzb3VyY2VzW2FkZC5sb2dpY2FsSWRdID0gYWRkLnJlc291cmNlRGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbGlzdCBvZiBpbXBvcnQgaWRlbnRpZmllcnMgZm9yIGFsbCByZXNvdXJjZSB0eXBlcyB1c2VkIGluIHRoZSBnaXZlblxuICAgKiB0ZW1wbGF0ZSB0aGF0IGRvIHN1cHBvcnQgdGhlIGltcG9ydCBvcGVyYXRpb24gKFNJTkdMRVRPTilcbiAgICpcbiAgICogQHJldHVybnMgYSBtYXBwaW5nIGZyb20gYSByZXNvdXJjZSB0eXBlIHRvIGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHRvZ2V0aGVyIGlkZW50aWZ5IHRoZSByZXNvdXJjZSBmb3IgaW1wb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc291cmNlSWRlbnRpZmllcnMoKTogUHJvbWlzZTxSZXNvdXJjZUlkZW50aWZpZXJzPiB7XG4gICAgY29uc3QgcmV0OiBSZXNvdXJjZUlkZW50aWZpZXJzID0ge307XG4gICAgY29uc3QgcmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzID0gYXdhaXQgdGhpcy5jZm4ucmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKHRoaXMuc3RhY2spO1xuICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiByZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMpIHtcbiAgICAgIGlmICgnUmVzb3VyY2VUeXBlJyBpbiBzdW1tYXJ5ICYmIHN1bW1hcnkuUmVzb3VyY2VUeXBlICYmICdSZXNvdXJjZUlkZW50aWZpZXJzJyBpbiBzdW1tYXJ5ICYmIHN1bW1hcnkuUmVzb3VyY2VJZGVudGlmaWVycykge1xuICAgICAgICByZXRbc3VtbWFyeS5SZXNvdXJjZVR5cGVdID0gKHN1bW1hcnkuUmVzb3VyY2VJZGVudGlmaWVycyA/PyBbXSk/Lm1hcCh4ID0+IHguc3BsaXQoJywnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogQXNrIGZvciB0aGUgaW1wb3J0YWJsZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2VcbiAgICpcbiAgICogVGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgaWRlbnRpZmllciB1bmRlciB3aGljaCBhIHJlc291cmNlIGNhbiBiZSBpbXBvcnRlZC4gVGhlIGBpbXBvcnRgXG4gICAqIG9wZXJhdGlvbiBuZWVkcyBleGFjdGx5IG9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiAtIElmIHdlIGNhbiBnZXQgb25lIGZyb20gdGhlIHRlbXBsYXRlLCB3ZSB3aWxsIHVzZSBvbmUuXG4gICAqIC0gT3RoZXJ3aXNlLCB3ZSB3aWxsIGFzayB0aGUgdXNlciBmb3Igb25lIG9mIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFza0ZvclJlc291cmNlSWRlbnRpZmllcihcbiAgICByZXNvdXJjZUlkZW50aWZpZXJzOiBSZXNvdXJjZUlkZW50aWZpZXJzLFxuICAgIGNoZzogSW1wb3J0YWJsZVJlc291cmNlLFxuICApOiBQcm9taXNlPFJlc291cmNlSWRlbnRpZmllclByb3BlcnRpZXMgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSB0aGlzLmRlc2NyaWJlUmVzb3VyY2UoY2hnLmxvZ2ljYWxJZCk7XG5cbiAgICAvLyBTa2lwIHJlc291cmNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGltcG9ydGluZ1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGNoZy5yZXNvdXJjZURpZmYubmV3UmVzb3VyY2VUeXBlO1xuICAgIGlmIChyZXNvdXJjZVR5cGUgPT09IHVuZGVmaW5lZCB8fCAhKHJlc291cmNlVHlwZSBpbiByZXNvdXJjZUlkZW50aWZpZXJzKSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX1dBUk4ubXNnKGAke3Jlc291cmNlTmFtZX06IHVuc3VwcG9ydGVkIHJlc291cmNlIHR5cGUgJHtyZXNvdXJjZVR5cGV9LCBza2lwcGluZyBpbXBvcnQuYCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBpZFByb3BTZXRzID0gcmVzb3VyY2VJZGVudGlmaWVyc1tyZXNvdXJjZVR5cGVdO1xuXG4gICAgLy8gUmV0YWluIG9ubHkgbGl0ZXJhbCBzdHJpbmdzOiBzdHJpcCBwb3RlbnRpYWwgQ0ZOIGludHJpbnNpY3NcbiAgICBjb25zdCByZXNvdXJjZVByb3BzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGNoZy5yZXNvdXJjZURlZmluaXRpb24uUHJvcGVydGllcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtfLCB2XSkgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnKSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgIC8vIEZpbmQgcHJvcGVydHkgc2V0cyB0aGF0IGFyZSBmdWxseSBzYXRpc2ZpZWQgaW4gdGhlIHRlbXBsYXRlLCBhc2sgdGhlIHVzZXIgdG8gY29uZmlybSB0aGVtXG4gICAgY29uc3Qgc2F0aXNmaWVkUHJvcFNldHMgPSBpZFByb3BTZXRzLmZpbHRlcihwcyA9PiBwcy5ldmVyeShwID0+IHJlc291cmNlUHJvcHNbcF0pKTtcbiAgICBmb3IgKGNvbnN0IHNhdGlzZmllZFByb3BTZXQgb2Ygc2F0aXNmaWVkUHJvcFNldHMpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZVByb3BzID0gT2JqZWN0LmZyb21FbnRyaWVzKHNhdGlzZmllZFByb3BTZXQubWFwKHAgPT4gW3AsIHJlc291cmNlUHJvcHNbcF1dKSk7XG4gICAgICBjb25zdCBkaXNwbGF5Q2FuZGlkYXRlUHJvcHMgPSBmbXRkaWN0KGNhbmRpZGF0ZVByb3BzKTtcblxuICAgICAgaWYgKGF3YWl0IHByb21wdGx5LmNvbmZpcm0oXG4gICAgICAgIGAke2NoYWxrLmJsdWUocmVzb3VyY2VOYW1lKX0gKCR7cmVzb3VyY2VUeXBlfSk6IGltcG9ydCB3aXRoICR7Y2hhbGsueWVsbG93KGRpc3BsYXlDYW5kaWRhdGVQcm9wcyl9ICh5ZXMvbm8pIFtkZWZhdWx0OiB5ZXNdPyBgLFxuICAgICAgICB7IGRlZmF1bHQ6ICd5ZXMnIH0sXG4gICAgICApKSB7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGVQcm9wcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBnb3QgaGVyZSBhbmQgdGhlIHVzZXIgcmVqZWN0ZWQgYW55IGF2YWlsYWJsZSBpZGVudGlmaWVycywgdGhlbiBhcHBhcmVudGx5IHRoZXkgZG9uJ3Qgd2FudCB0aGUgcmVzb3VyY2UgYXQgYWxsXG4gICAgaWYgKHNhdGlzZmllZFByb3BTZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhjaGFsay5ncmV5KGBTa2lwcGluZyBpbXBvcnQgb2YgJHtyZXNvdXJjZU5hbWV9YCkpKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gV2UgY2Fubm90IGF1dG8taW1wb3J0IHRoaXMsIGFzayB0aGUgdXNlciBmb3Igb25lIG9mIHRoZSBwcm9wc1xuICAgIC8vIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBjYXNlcyBpcyB3aGF0IHdlIHByaW50OiBmb3IgbXVsdGlwbGUgcHJvcGVydGllcywgd2UgcHJpbnQgYSBwcmVhbWJsZVxuICAgIGNvbnN0IHByZWZpeCA9IGAke2NoYWxrLmJsdWUocmVzb3VyY2VOYW1lKX0gKCR7cmVzb3VyY2VUeXBlfSlgO1xuICAgIGxldCBwcmVhbWJsZTtcbiAgICBsZXQgcHJvbXB0UGF0dGVybjtcbiAgICBpZiAoaWRQcm9wU2V0cy5sZW5ndGggPiAxKSB7XG4gICAgICBwcmVhbWJsZSA9IGAke3ByZWZpeH06IGVudGVyIG9uZSBvZiAke2lkUHJvcFNldHMubWFwKHggPT4gY2hhbGsuYmx1ZSh4LmpvaW4oJysnKSkpLmpvaW4oJywgJyl9IHRvIGltcG9ydCAoYWxsIGVtcHR5IHRvIHNraXApYDtcbiAgICAgIHByb21wdFBhdHRlcm4gPSBgJHtwcmVmaXh9OiBlbnRlciAlYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbXB0UGF0dGVybiA9IGAke3ByZWZpeH06IGVudGVyICVgO1xuICAgIH1cblxuICAgIC8vIERvIHRoZSBpbnB1dCBsb29wIGhlcmVcbiAgICBpZiAocHJlYW1ibGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhwcmVhbWJsZSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGlkUHJvcHMgb2YgaWRQcm9wU2V0cykge1xuICAgICAgY29uc3QgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgaWRQcm9wIG9mIGlkUHJvcHMpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZhbHVlIGZyb20gdGhlIHRlbXBsYXRlLCB1c2UgaXQgYXMgZGVmYXVsdC4gVGhpcyB3aWxsIG9ubHkgYmUgYSBwYXJ0aWFsXG4gICAgICAgIC8vIGlkZW50aWZpZXIgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgZG9uZSB0aGUgaW1wb3J0IGFscmVhZHkgYWJvdmUuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJlc291cmNlUHJvcHNbaWRQcm9wXSA/PyAnJztcblxuICAgICAgICBjb25zdCBwcm9tcHQgPSBbXG4gICAgICAgICAgcHJvbXB0UGF0dGVybi5yZXBsYWNlKC8lL2csIGNoYWxrLmJsdWUoaWRQcm9wKSksXG4gICAgICAgICAgZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICA/IGBbJHtkZWZhdWx0VmFsdWV9XWBcbiAgICAgICAgICAgIDogJyhlbXB0eSB0byBza2lwKScsXG4gICAgICAgIF0uam9pbignICcpICsgJzonO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb21wdGx5LnByb21wdChwcm9tcHQsXG4gICAgICAgICAgeyBkZWZhdWx0OiBkZWZhdWx0VmFsdWUsIHRyaW06IHRydWUgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dFtpZFByb3BdID0gcmVzcG9uc2U7XG4gICAgICAgIC8vIEFsc28gc3RpY2sgdGhpcyBwcm9wZXJ0eSBpbnRvICdyZXNvdXJjZVByb3BzJywgc28gdGhhdCBpdCBtYXkgYmUgcmV1c2VkIGJ5IGEgc3Vic2VxdWVudCBxdWVzdGlvblxuICAgICAgICAvLyAoZm9yIGEgZGlmZmVyZW50IGNvbXBvdW5kIGlkZW50aWZpZXIgdGhhdCBpbnZvbHZlcyB0aGUgc2FtZSBwcm9wZXJ0eSkuIEp1c3QgYSBzbWFsbCBVWCBlbmhhbmNlbWVudC5cbiAgICAgICAgcmVzb3VyY2VQcm9wc1tpZFByb3BdID0gcmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB1c2VyIGdhdmUgaW5wdXRzIGZvciBhbGwgdmFsdWVzLCB3ZSBhcmUgY29tcGxldGVcbiAgICAgIGlmIChPYmplY3Qua2V5cyhpbnB1dCkubGVuZ3RoID09PSBpZFByb3BzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0lORk8ubXNnKGNoYWxrLmdyZXkoYFNraXBwaW5nIGltcG9ydCBvZiAke3Jlc291cmNlTmFtZX1gKSkpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgaW50ZXJuYWwgXCJyZXNvdXJjZSBtYXBwaW5nXCIgc3RydWN0dXJlIHRvIENsb3VkRm9ybWF0aW9uIGFjY2VwdGVkIFwiUmVzb3VyY2VzVG9JbXBvcnRcIiBzdHJ1Y3R1cmVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJlc291cmNlc1RvSW1wb3J0KHJlc291cmNlTWFwOiBJbXBvcnRNYXApOiBQcm9taXNlPFJlc291cmNlc1RvSW1wb3J0PiB7XG4gICAgcmV0dXJuIHJlc291cmNlTWFwLmltcG9ydFJlc291cmNlcy5tYXAocmVzID0+ICh7XG4gICAgICBMb2dpY2FsUmVzb3VyY2VJZDogcmVzLmxvZ2ljYWxJZCxcbiAgICAgIFJlc291cmNlVHlwZTogcmVzLnJlc291cmNlRGlmZi5uZXdSZXNvdXJjZVR5cGUhLFxuICAgICAgUmVzb3VyY2VJZGVudGlmaWVyOiByZXNvdXJjZU1hcC5yZXNvdXJjZU1hcFtyZXMubG9naWNhbElkXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBDbG91ZEZvcm1hdGlvbiBsb2dpY2FsIHJlc291cmNlIElEIHRvIENESyBjb25zdHJ1Y3QgdHJlZSBwYXRoXG4gICAqXG4gICAqIEBwYXJhbSBsb2dpY2FsSWQgQ2xvdWRGb3JtYXRpb24gbG9naWNhbCBJRCBvZiB0aGUgcmVzb3VyY2UgKHRoZSBrZXkgaW4gdGhlIHRlbXBsYXRlJ3MgUmVzb3VyY2VzIHNlY3Rpb24pXG4gICAqIEByZXR1cm5zIEZvcndhcmQtc2xhc2ggc2VwYXJhdGVkIHBhdGggb2YgdGhlIHJlc291cmNlIGluIENESyBjb25zdHJ1Y3QgdHJlZSwgZS5nLiBNeVN0YWNrL015QnVja2V0L1Jlc291cmNlXG4gICAqL1xuICBwcml2YXRlIGRlc2NyaWJlUmVzb3VyY2UobG9naWNhbElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YWNrLnRlbXBsYXRlPy5SZXNvdXJjZXM/Lltsb2dpY2FsSWRdPy5NZXRhZGF0YT8uWydhd3M6Y2RrOnBhdGgnXSA/PyBsb2dpY2FsSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBDREtNZXRhZGF0YSBhbmQgT3V0cHV0cyBpbiB0aGUgdGVtcGxhdGUgc28gdGhhdCBvbmx5IHJlc291cmNlcyBmb3IgaW1wb3J0aW5nIGFyZSBsZWZ0LlxuICAgKiBAcmV0dXJucyB0ZW1wbGF0ZSB3aXRoIGltcG9ydCByZXNvdXJjZXMgb25seVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVOb25JbXBvcnRSZXNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHJlbW92ZU5vbkltcG9ydFJlc291cmNlcyh0aGlzLnN0YWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgQ0RLTWV0YWRhdGEgYW5kIE91dHB1dHMgaW4gdGhlIHRlbXBsYXRlIHNvIHRoYXQgb25seSByZXNvdXJjZXMgZm9yIGltcG9ydGluZyBhcmUgbGVmdC5cbiAqIEByZXR1cm5zIHRlbXBsYXRlIHdpdGggaW1wb3J0IHJlc291cmNlcyBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOb25JbXBvcnRSZXNvdXJjZXMoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCkge1xuICBjb25zdCB0ZW1wbGF0ZSA9IHN0YWNrLnRlbXBsYXRlO1xuICBkZWxldGUgdGVtcGxhdGUuUmVzb3VyY2VzLkNES01ldGFkYXRhO1xuICBkZWxldGUgdGVtcGxhdGUuT3V0cHV0cztcbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgcmVzb3VyY2UgaW4gdGhlIHRlbXBsYXRlIHRoYXQgaXMgaW1wb3J0YWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydGFibGVSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgbG9naWNhbCBJRCBvZiB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IGxvZ2ljYWxJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgZGVmaW5pdGlvbiBpbiB0aGUgbmV3IHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZURlZmluaXRpb246IGFueTtcblxuICAvKipcbiAgICogVGhlIGRpZmYgYXMgcmVwb3J0ZWQgYnkgYGNsb3VkZm9ybWF0aW9uLWRpZmZgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VEaWZmOiBSZXNvdXJjZURpZmZlcmVuY2U7XG59XG5cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBleGVjdXRlIGFuIGltcG9ydCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRNYXAge1xuICAvKipcbiAgICogTWFwcGluZyBsb2dpY2FsIElEcyB0byBwaHlzaWNhbCBuYW1lc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VNYXA6IFJlc291cmNlTWFwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0aW9uIG9mIHJlc291cmNlcyB3ZSBhcmUgYWN0dWFsbHkgaW1wb3J0aW5nXG4gICAqXG4gICAqIEZvciBlYWNoIG9mIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBsaXN0LCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW5cbiAgICogdGhlIGByZXNvdXJjZU1hcGAgbWFwLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0UmVzb3VyY2VzOiBJbXBvcnRhYmxlUmVzb3VyY2VbXTtcbn1cblxuZnVuY3Rpb24gZm10ZGljdDxBPih4czogUmVjb3JkPHN0cmluZywgQT4pIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHhzKS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JHt2fWApLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogQWRkIGEgZGVmYXVsdCBgRGVsZXRpb25Qb2xpY3lgIHBvbGljeS5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNldCB0byAnUmV0YWluJywgdG8gbG93ZXIgcmlzayBvZiB1bmludGVudGlvbmFsbHlcbiAqIGRlbGV0aW5nIHN0YXRlZnVsIHJlc291cmNlcyBpbiB0aGUgcHJvY2VzcyBvZiBpbXBvcnRpbmcgdG8gQ0RLLlxuICovXG5mdW5jdGlvbiBhZGREZWZhdWx0RGVsZXRpb25Qb2xpY3kocmVzb3VyY2U6IGFueSk6IGFueSB7XG4gIGlmIChyZXNvdXJjZS5EZWxldGlvblBvbGljeSkge1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzb3VyY2UsXG4gICAgRGVsZXRpb25Qb2xpY3k6ICdSZXRhaW4nLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2NvdmVySW1wb3J0YWJsZVJlc291cmNlc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGFkZGl0aW9uczogSW1wb3J0YWJsZVJlc291cmNlW107XG4gIHJlYWRvbmx5IGhhc05vbkFkZGl0aW9uczogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type * as cxapi from '@aws-cdk/cx-api';
|
|
2
|
-
import type { ImportDeploymentOptions, ResourcesToImport } from './importer';
|
|
3
|
-
import { type IoHelper } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private';
|
|
4
|
-
import type { StackCollection } from '../cxapp/cloud-assembly';
|
|
5
|
-
import type { Deployments } from '../deployments';
|
|
6
|
-
export interface ResourceMigratorProps {
|
|
7
|
-
deployments: Deployments;
|
|
8
|
-
ioHelper: IoHelper;
|
|
9
|
-
}
|
|
10
|
-
export declare class ResourceMigrator {
|
|
11
|
-
private readonly props;
|
|
12
|
-
private readonly ioHelper;
|
|
13
|
-
constructor(props: ResourceMigratorProps);
|
|
14
|
-
/**
|
|
15
|
-
* Checks to see if a migrate.json file exists. If it does and the source is either `filepath` or
|
|
16
|
-
* is in the same environment as the stack deployment, a new stack is created and the resources are
|
|
17
|
-
* migrated to the stack using an IMPORT changeset. The normal deployment will resume after this is complete
|
|
18
|
-
* to add back in any outputs and the CDKMetadata.
|
|
19
|
-
*/
|
|
20
|
-
tryMigrateResources(stacks: StackCollection, options: ImportDeploymentOptions): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Creates a new stack with just the resources to be migrated
|
|
23
|
-
*/
|
|
24
|
-
private performResourceMigration;
|
|
25
|
-
tryGetResources(environment: cxapi.Environment): Promise<ResourcesToImport | undefined>;
|
|
26
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ResourceMigrator = void 0;
|
|
4
|
-
const chalk = require("chalk");
|
|
5
|
-
const fs = require("fs-extra");
|
|
6
|
-
const importer_1 = require("./importer");
|
|
7
|
-
const private_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
|
|
8
|
-
const util_1 = require("../../util");
|
|
9
|
-
class ResourceMigrator {
|
|
10
|
-
constructor(props) {
|
|
11
|
-
this.props = props;
|
|
12
|
-
this.ioHelper = props.ioHelper;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Checks to see if a migrate.json file exists. If it does and the source is either `filepath` or
|
|
16
|
-
* is in the same environment as the stack deployment, a new stack is created and the resources are
|
|
17
|
-
* migrated to the stack using an IMPORT changeset. The normal deployment will resume after this is complete
|
|
18
|
-
* to add back in any outputs and the CDKMetadata.
|
|
19
|
-
*/
|
|
20
|
-
async tryMigrateResources(stacks, options) {
|
|
21
|
-
const stack = stacks.stackArtifacts[0];
|
|
22
|
-
const migrateDeployment = new importer_1.ResourceImporter(stack, {
|
|
23
|
-
deployments: this.props.deployments,
|
|
24
|
-
ioHelper: this.ioHelper,
|
|
25
|
-
});
|
|
26
|
-
const resourcesToImport = await this.tryGetResources(await migrateDeployment.resolveEnvironment());
|
|
27
|
-
if (resourcesToImport) {
|
|
28
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(`${chalk.bold(stack.displayName)}: creating stack for resource migration...`));
|
|
29
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(`${chalk.bold(stack.displayName)}: importing resources into stack...`));
|
|
30
|
-
await this.performResourceMigration(migrateDeployment, resourcesToImport, options);
|
|
31
|
-
fs.rmSync('migrate.json');
|
|
32
|
-
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(`${chalk.bold(stack.displayName)}: applying CDKMetadata and Outputs to stack (if applicable)...`));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Creates a new stack with just the resources to be migrated
|
|
37
|
-
*/
|
|
38
|
-
async performResourceMigration(migrateDeployment, resourcesToImport, options) {
|
|
39
|
-
const startDeployTime = new Date().getTime();
|
|
40
|
-
let elapsedDeployTime = 0;
|
|
41
|
-
// Initial Deployment
|
|
42
|
-
await migrateDeployment.importResourcesFromMigrate(resourcesToImport, {
|
|
43
|
-
roleArn: options.roleArn,
|
|
44
|
-
deploymentMethod: options.deploymentMethod,
|
|
45
|
-
usePreviousParameters: true,
|
|
46
|
-
rollback: options.rollback,
|
|
47
|
-
});
|
|
48
|
-
elapsedDeployTime = new Date().getTime() - startDeployTime;
|
|
49
|
-
await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5002.msg(`'\n✨ Resource migration time: ${(0, util_1.formatTime)(elapsedDeployTime)}s\n'`, {
|
|
50
|
-
duration: elapsedDeployTime,
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
async tryGetResources(environment) {
|
|
54
|
-
try {
|
|
55
|
-
const migrateFile = fs.readJsonSync('migrate.json', {
|
|
56
|
-
encoding: 'utf-8',
|
|
57
|
-
});
|
|
58
|
-
const sourceEnv = migrateFile.Source.split(':');
|
|
59
|
-
if (sourceEnv[0] === 'localfile' ||
|
|
60
|
-
(sourceEnv[4] === environment.account && sourceEnv[3] === environment.region)) {
|
|
61
|
-
return migrateFile.Resources;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
// Nothing to do
|
|
66
|
-
}
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
exports.ResourceMigrator = ResourceMigrator;
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtaWdyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrQkFBK0I7QUFDL0IsK0JBQStCO0FBRS9CLHlDQUE4QztBQUM5Qyx5RkFBZ0c7QUFDaEcscUNBQXdDO0FBU3hDLE1BQWEsZ0JBQWdCO0lBSTNCLFlBQW1CLEtBQTRCO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBdUIsRUFBRSxPQUFnQztRQUN4RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSwyQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztZQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFFbkcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUM7WUFDdEksTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztZQUUvSCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVuRixFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7UUFDNUosQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyx3QkFBd0IsQ0FDcEMsaUJBQW1DLEVBQ25DLGlCQUFvQyxFQUNwQyxPQUFnQztRQUVoQyxNQUFNLGVBQWUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRTFCLHFCQUFxQjtRQUNyQixNQUFNLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFO1lBQ3BFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1NBQzNCLENBQUMsQ0FBQztRQUVILGlCQUFpQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsZUFBZSxDQUFDO1FBQzNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsSUFBQSxpQkFBVSxFQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUN6SCxRQUFRLEVBQUUsaUJBQWlCO1NBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBOEI7UUFDekQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUU7Z0JBQ2xELFFBQVEsRUFBRSxPQUFPO2FBQ2xCLENBQUMsQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFJLFdBQVcsQ0FBQyxNQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1RCxJQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXO2dCQUM1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQzdFLENBQUM7Z0JBQ0QsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLGdCQUFnQjtRQUNsQixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBN0VELDRDQTZFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB0eXBlIHsgSW1wb3J0RGVwbG95bWVudE9wdGlvbnMsIFJlc291cmNlc1RvSW1wb3J0IH0gZnJvbSAnLi9pbXBvcnRlcic7XG5pbXBvcnQgeyBSZXNvdXJjZUltcG9ydGVyIH0gZnJvbSAnLi9pbXBvcnRlcic7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IGZvcm1hdFRpbWUgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU3RhY2tDb2xsZWN0aW9uIH0gZnJvbSAnLi4vY3hhcHAvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3ltZW50cyB9IGZyb20gJy4uL2RlcGxveW1lbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1pZ3JhdG9yUHJvcHMge1xuICBkZXBsb3ltZW50czogRGVwbG95bWVudHM7XG4gIGlvSGVscGVyOiBJb0hlbHBlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTWlncmF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBSZXNvdXJjZU1pZ3JhdG9yUHJvcHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogUmVzb3VyY2VNaWdyYXRvclByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuaW9IZWxwZXIgPSBwcm9wcy5pb0hlbHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIGEgbWlncmF0ZS5qc29uIGZpbGUgZXhpc3RzLiBJZiBpdCBkb2VzIGFuZCB0aGUgc291cmNlIGlzIGVpdGhlciBgZmlsZXBhdGhgIG9yXG4gICAqIGlzIGluIHRoZSBzYW1lIGVudmlyb25tZW50IGFzIHRoZSBzdGFjayBkZXBsb3ltZW50LCBhIG5ldyBzdGFjayBpcyBjcmVhdGVkIGFuZCB0aGUgcmVzb3VyY2VzIGFyZVxuICAgKiBtaWdyYXRlZCB0byB0aGUgc3RhY2sgdXNpbmcgYW4gSU1QT1JUIGNoYW5nZXNldC4gVGhlIG5vcm1hbCBkZXBsb3ltZW50IHdpbGwgcmVzdW1lIGFmdGVyIHRoaXMgaXMgY29tcGxldGVcbiAgICogdG8gYWRkIGJhY2sgaW4gYW55IG91dHB1dHMgYW5kIHRoZSBDREtNZXRhZGF0YS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cnlNaWdyYXRlUmVzb3VyY2VzKHN0YWNrczogU3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLnN0YWNrQXJ0aWZhY3RzWzBdO1xuICAgIGNvbnN0IG1pZ3JhdGVEZXBsb3ltZW50ID0gbmV3IFJlc291cmNlSW1wb3J0ZXIoc3RhY2ssIHtcbiAgICAgIGRlcGxveW1lbnRzOiB0aGlzLnByb3BzLmRlcGxveW1lbnRzLFxuICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzb3VyY2VzVG9JbXBvcnQgPSBhd2FpdCB0aGlzLnRyeUdldFJlc291cmNlcyhhd2FpdCBtaWdyYXRlRGVwbG95bWVudC5yZXNvbHZlRW52aXJvbm1lbnQoKSk7XG5cbiAgICBpZiAocmVzb3VyY2VzVG9JbXBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IGNyZWF0aW5nIHN0YWNrIGZvciByZXNvdXJjZSBtaWdyYXRpb24uLi5gKSk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBpbXBvcnRpbmcgcmVzb3VyY2VzIGludG8gc3RhY2suLi5gKSk7XG5cbiAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVJlc291cmNlTWlncmF0aW9uKG1pZ3JhdGVEZXBsb3ltZW50LCByZXNvdXJjZXNUb0ltcG9ydCwgb3B0aW9ucyk7XG5cbiAgICAgIGZzLnJtU3luYygnbWlncmF0ZS5qc29uJyk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBhcHBseWluZyBDREtNZXRhZGF0YSBhbmQgT3V0cHV0cyB0byBzdGFjayAoaWYgYXBwbGljYWJsZSkuLi5gKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc3RhY2sgd2l0aCBqdXN0IHRoZSByZXNvdXJjZXMgdG8gYmUgbWlncmF0ZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVJlc291cmNlTWlncmF0aW9uKFxuICAgIG1pZ3JhdGVEZXBsb3ltZW50OiBSZXNvdXJjZUltcG9ydGVyLFxuICAgIHJlc291cmNlc1RvSW1wb3J0OiBSZXNvdXJjZXNUb0ltcG9ydCxcbiAgICBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc3RhcnREZXBsb3lUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgbGV0IGVsYXBzZWREZXBsb3lUaW1lID0gMDtcblxuICAgIC8vIEluaXRpYWwgRGVwbG95bWVudFxuICAgIGF3YWl0IG1pZ3JhdGVEZXBsb3ltZW50LmltcG9ydFJlc291cmNlc0Zyb21NaWdyYXRlKHJlc291cmNlc1RvSW1wb3J0LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICBkZXBsb3ltZW50TWV0aG9kOiBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QsXG4gICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IHRydWUsXG4gICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICB9KTtcblxuICAgIGVsYXBzZWREZXBsb3lUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydERlcGxveVRpbWU7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUwMDIubXNnKGAnXFxu4pyoICBSZXNvdXJjZSBtaWdyYXRpb24gdGltZTogJHtmb3JtYXRUaW1lKGVsYXBzZWREZXBsb3lUaW1lKX1zXFxuJ2AsIHtcbiAgICAgIGR1cmF0aW9uOiBlbGFwc2VkRGVwbG95VGltZSxcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdHJ5R2V0UmVzb3VyY2VzKGVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudCk6IFByb21pc2U8UmVzb3VyY2VzVG9JbXBvcnQgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWlncmF0ZUZpbGUgPSBmcy5yZWFkSnNvblN5bmMoJ21pZ3JhdGUuanNvbicsIHtcbiAgICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNvdXJjZUVudiA9IChtaWdyYXRlRmlsZS5Tb3VyY2UgYXMgc3RyaW5nKS5zcGxpdCgnOicpO1xuICAgICAgaWYgKFxuICAgICAgICBzb3VyY2VFbnZbMF0gPT09ICdsb2NhbGZpbGUnIHx8XG4gICAgICAgIChzb3VyY2VFbnZbNF0gPT09IGVudmlyb25tZW50LmFjY291bnQgJiYgc291cmNlRW52WzNdID09PSBlbnZpcm9ubWVudC5yZWdpb24pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG1pZ3JhdGVGaWxlLlJlc291cmNlcztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGRvXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4iXX0=
|
|
@@ -1,20 +0,0 @@
|
|
|
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("./stack-activity-monitor"), exports);
|
|
18
|
-
__exportStar(require("./stack-event-poller"), exports);
|
|
19
|
-
__exportStar(require("./stack-status"), exports);
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQXlDO0FBQ3pDLHVEQUFxQztBQUNyQyxpREFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N0YWNrLWFjdGl2aXR5LW1vbml0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFjay1ldmVudC1wb2xsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFjay1zdGF0dXMnO1xuIl19
|