@aws-cdk/app-staging-synthesizer-alpha 2.82.0-alpha.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.
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AppStagingSynthesizer = void 0;
5
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
8
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
9
+ const bootstrap_roles_1 = require("./bootstrap-roles");
10
+ const default_staging_stack_1 = require("./default-staging-stack");
11
+ const per_env_staging_factory_1 = require("./per-env-staging-factory");
12
+ const app_global_1 = require("./private/app-global");
13
+ const no_tokens_1 = require("./private/no-tokens");
14
+ const AGNOSTIC_STACKS = new app_global_1.AppScopedGlobal(() => new Set());
15
+ const ENV_AWARE_STACKS = new app_global_1.AppScopedGlobal(() => new Set());
16
+ /**
17
+ * App Staging Synthesizer
18
+ */
19
+ class AppStagingSynthesizer extends aws_cdk_lib_1.StackSynthesizer {
20
+ /**
21
+ * Use the Default Staging Resources, creating a single stack per environment this app is deployed in
22
+ */
23
+ static defaultResources(options) {
24
+ try {
25
+ jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_DefaultResourcesOptions(options);
26
+ }
27
+ catch (error) {
28
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
29
+ Error.captureStackTrace(error, this.defaultResources);
30
+ }
31
+ throw error;
32
+ }
33
+ (0, no_tokens_1.validateNoTokens)(options, 'AppStagingSynthesizer');
34
+ return AppStagingSynthesizer.customFactory({
35
+ factory: default_staging_stack_1.DefaultStagingStack.factory(options),
36
+ deploymentIdentities: options.deploymentIdentities,
37
+ bootstrapQualifier: options.bootstrapQualifier,
38
+ oncePerEnv: true,
39
+ });
40
+ }
41
+ /**
42
+ * Use these exact staging resources for every stack that this synthesizer is used for
43
+ */
44
+ static customResources(options) {
45
+ try {
46
+ jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_CustomResourcesOptions(options);
47
+ }
48
+ catch (error) {
49
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
50
+ Error.captureStackTrace(error, this.customResources);
51
+ }
52
+ throw error;
53
+ }
54
+ return AppStagingSynthesizer.customFactory({
55
+ deploymentIdentities: options.deploymentIdentities,
56
+ bootstrapQualifier: options.bootstrapQualifier,
57
+ oncePerEnv: false,
58
+ factory: {
59
+ obtainStagingResources() {
60
+ return options.resources;
61
+ },
62
+ },
63
+ });
64
+ }
65
+ /**
66
+ * Supply your own stagingStackFactory method for creating an IStagingStack when
67
+ * a stack is bound to the synthesizer.
68
+ *
69
+ * By default, `oncePerEnv = true`, which means that a new instance of the IStagingStack
70
+ * will be created in new environments. Set `oncePerEnv = false` to turn off that behavior.
71
+ */
72
+ static customFactory(options) {
73
+ try {
74
+ jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_CustomFactoryOptions(options);
75
+ }
76
+ catch (error) {
77
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
78
+ Error.captureStackTrace(error, this.customFactory);
79
+ }
80
+ throw error;
81
+ }
82
+ const oncePerEnv = options.oncePerEnv ?? true;
83
+ const factory = oncePerEnv ? new per_env_staging_factory_1.PerEnvironmentStagingFactory(options.factory) : options.factory;
84
+ return new AppStagingSynthesizer({
85
+ factory,
86
+ bootstrapQualifier: options.bootstrapQualifier,
87
+ deploymentIdentities: options.deploymentIdentities,
88
+ });
89
+ }
90
+ constructor(props) {
91
+ super();
92
+ this.props = props;
93
+ this.roles = {
94
+ deploymentRole: props.deploymentIdentities?.roles.deploymentRole ??
95
+ bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_DEPLOY_ROLE_ARN),
96
+ cloudFormationExecutionRole: props.deploymentIdentities?.roles.cloudFormationExecutionRole ??
97
+ bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_CLOUDFORMATION_ROLE_ARN),
98
+ lookupRole: this.props.deploymentIdentities?.roles.lookupRole ??
99
+ bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_LOOKUP_ROLE_ARN),
100
+ };
101
+ }
102
+ /**
103
+ * Returns a version of the synthesizer bound to a stack.
104
+ */
105
+ reusableBind(stack) {
106
+ this.checkEnvironmentGnosticism(stack);
107
+ const qualifier = this.props.bootstrapQualifier ??
108
+ stack.node.tryGetContext(aws_cdk_lib_1.BOOTSTRAP_QUALIFIER_CONTEXT) ??
109
+ AppStagingSynthesizer.DEFAULT_QUALIFIER;
110
+ const spec = new helpers_internal_1.StringSpecializer(stack, qualifier);
111
+ const deployRole = this.roles.deploymentRole._specialize(spec);
112
+ const context = {
113
+ environmentString: [
114
+ aws_cdk_lib_1.Token.isUnresolved(stack.account) ? 'ACCOUNT' : stack.account,
115
+ aws_cdk_lib_1.Token.isUnresolved(stack.region) ? 'REGION' : stack.region,
116
+ ].join('-'),
117
+ deployRoleArn: deployRole._arnForCloudFormation(),
118
+ qualifier,
119
+ };
120
+ return new BoundAppStagingSynthesizer(stack, {
121
+ stagingResources: this.props.factory.obtainStagingResources(stack, context),
122
+ deployRole,
123
+ cloudFormationExecutionRole: this.roles.cloudFormationExecutionRole._specialize(spec),
124
+ lookupRole: this.roles.lookupRole._specialize(spec),
125
+ qualifier,
126
+ });
127
+ }
128
+ /**
129
+ * Implemented for legacy purposes; this will never be called.
130
+ */
131
+ bind(_stack) {
132
+ throw new Error('This is a legacy API, call reusableBind instead');
133
+ }
134
+ /**
135
+ * Implemented for legacy purposes; this will never be called.
136
+ */
137
+ synthesize(_session) {
138
+ throw new Error('This is a legacy API, call reusableBind instead');
139
+ }
140
+ /**
141
+ * Implemented for legacy purposes; this will never be called.
142
+ */
143
+ addFileAsset(_asset) {
144
+ throw new Error('This is a legacy API, call reusableBind instead');
145
+ }
146
+ /**
147
+ * Implemented for legacy purposes; this will never be called.
148
+ */
149
+ addDockerImageAsset(_asset) {
150
+ throw new Error('This is a legacy API, call reusableBind instead');
151
+ }
152
+ /**
153
+ * Check that we're only being used for exclusively gnostic or agnostic stacks.
154
+ *
155
+ * We can think about whether to loosen this requirement later.
156
+ */
157
+ checkEnvironmentGnosticism(stack) {
158
+ const isAgnostic = aws_cdk_lib_1.Token.isUnresolved(stack.account) || aws_cdk_lib_1.Token.isUnresolved(stack.region);
159
+ const agnosticStacks = AGNOSTIC_STACKS.for(stack);
160
+ const envAwareStacks = ENV_AWARE_STACKS.for(stack);
161
+ (isAgnostic ? agnosticStacks : envAwareStacks).add(stack);
162
+ if (agnosticStacks.size > 0 && envAwareStacks.size > 0) {
163
+ const describeStacks = (xs) => Array.from(xs).map(s => s.node.path).join(', ');
164
+ throw new Error([
165
+ 'It is not safe to use AppStagingSynthesizer for both environment-agnostic and environment-aware stacks at the same time.',
166
+ 'Please either specify environments for all stacks or no stacks in the CDK App.',
167
+ `Stacks with environment: ${describeStacks(agnosticStacks)}.`,
168
+ `Stacks without environment: ${describeStacks(envAwareStacks)}.`,
169
+ ].join(' '));
170
+ }
171
+ }
172
+ }
173
+ _a = JSII_RTTI_SYMBOL_1;
174
+ AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.82.0-alpha.0" };
175
+ /**
176
+ * Default ARN qualifier
177
+ */
178
+ AppStagingSynthesizer.DEFAULT_QUALIFIER = 'hnb659fds';
179
+ /**
180
+ * Default CloudFormation role ARN.
181
+ */
182
+ AppStagingSynthesizer.DEFAULT_CLOUDFORMATION_ROLE_ARN = 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}';
183
+ /**
184
+ * Default deploy role ARN.
185
+ */
186
+ AppStagingSynthesizer.DEFAULT_DEPLOY_ROLE_ARN = 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}';
187
+ /**
188
+ * Default lookup role ARN for missing values.
189
+ */
190
+ AppStagingSynthesizer.DEFAULT_LOOKUP_ROLE_ARN = 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}';
191
+ exports.AppStagingSynthesizer = AppStagingSynthesizer;
192
+ class BoundAppStagingSynthesizer extends aws_cdk_lib_1.StackSynthesizer {
193
+ constructor(stack, props) {
194
+ super();
195
+ this.props = props;
196
+ this.assetManifest = new aws_cdk_lib_1.AssetManifestBuilder();
197
+ this.dependencyStacks = new Set();
198
+ super.bind(stack);
199
+ this.qualifier = props.qualifier;
200
+ this.stagingStack = props.stagingResources;
201
+ }
202
+ /**
203
+ * The qualifier used to bootstrap this stack
204
+ */
205
+ get bootstrapQualifier() {
206
+ // Not sure why we need this.
207
+ return this.qualifier;
208
+ }
209
+ synthesize(session) {
210
+ const templateAssetSource = this.synthesizeTemplate(session, this.props.lookupRole?._arnForCloudAssembly());
211
+ const templateAsset = this.addFileAsset(templateAssetSource);
212
+ const dependencies = Array.from(this.dependencyStacks).flatMap((d) => d.artifactId);
213
+ const assetManifestId = this.assetManifest.emitManifest(this.boundStack, session, {}, dependencies);
214
+ const lookupRoleArn = this.props.lookupRole?._arnForCloudAssembly();
215
+ this.emitArtifact(session, {
216
+ assumeRoleArn: this.props.deployRole?._arnForCloudAssembly(),
217
+ additionalDependencies: [assetManifestId],
218
+ stackTemplateAssetObjectUrl: templateAsset.s3ObjectUrlWithPlaceholders,
219
+ cloudFormationExecutionRoleArn: this.props.cloudFormationExecutionRole?._arnForCloudAssembly(),
220
+ lookupRole: lookupRoleArn ? { arn: lookupRoleArn } : undefined,
221
+ });
222
+ }
223
+ /**
224
+ * Add a file asset to the manifest.
225
+ */
226
+ addFileAsset(asset) {
227
+ const { bucketName, assumeRoleArn, prefix, dependencyStack } = this.stagingStack.addFile(asset);
228
+ const location = this.assetManifest.defaultAddFileAsset(this.boundStack, asset, {
229
+ bucketName: (0, helpers_internal_1.translateCfnTokenToAssetToken)(bucketName),
230
+ bucketPrefix: prefix,
231
+ role: assumeRoleArn ? { assumeRoleArn: (0, helpers_internal_1.translateCfnTokenToAssetToken)(assumeRoleArn) } : undefined,
232
+ });
233
+ if (dependencyStack) {
234
+ this.boundStack.addDependency(dependencyStack, 'stack depends on the staging stack for staging resources');
235
+ this.dependencyStacks.add(dependencyStack);
236
+ }
237
+ return this.cloudFormationLocationFromFileAsset(location);
238
+ }
239
+ /**
240
+ * Add a docker image asset to the manifest.
241
+ */
242
+ addDockerImageAsset(asset) {
243
+ const { repoName, assumeRoleArn, dependencyStack } = this.stagingStack.addDockerImage(asset);
244
+ const location = this.assetManifest.defaultAddDockerImageAsset(this.boundStack, asset, {
245
+ repositoryName: (0, helpers_internal_1.translateCfnTokenToAssetToken)(repoName),
246
+ role: assumeRoleArn ? { assumeRoleArn: (0, helpers_internal_1.translateCfnTokenToAssetToken)(assumeRoleArn) } : undefined,
247
+ });
248
+ if (dependencyStack) {
249
+ this.boundStack.addDependency(dependencyStack, 'stack depends on the staging stack for staging resources');
250
+ this.dependencyStacks.add(dependencyStack);
251
+ }
252
+ return this.cloudFormationLocationFromDockerImageAsset(location);
253
+ }
254
+ }
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWdpbmctc3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcHAtc3RhZ2luZy1zeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2Q0FhcUI7QUFDckIsNEVBQXlHO0FBQ3pHLHVEQUF3RjtBQUN4RixtRUFBMEY7QUFDMUYsdUVBQXlHO0FBQ3pHLHFEQUF1RDtBQUN2RCxtREFBdUQ7QUFHdkQsTUFBTSxlQUFlLEdBQUcsSUFBSSw0QkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFTLENBQUMsQ0FBQztBQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksNEJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBUyxDQUFDLENBQUM7QUF5RXJFOztHQUVHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSw4QkFBZ0I7SUFxQnpEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWdDOzs7Ozs7Ozs7O1FBQzdELElBQUEsNEJBQWdCLEVBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFbkQsT0FBTyxxQkFBcUIsQ0FBQyxhQUFhLENBQUM7WUFDekMsT0FBTyxFQUFFLDJDQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDN0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtZQUNsRCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1lBQzlDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQStCOzs7Ozs7Ozs7O1FBQzNELE9BQU8scUJBQXFCLENBQUMsYUFBYSxDQUFDO1lBQ3pDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7WUFDbEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxVQUFVLEVBQUUsS0FBSztZQUNq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SUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sSUFBSSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2xFO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBc3NldE1hbmlmZXN0QnVpbGRlcixcbiAgQk9PVFNUUkFQX1FVQUxJRklFUl9DT05URVhULFxuICBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24sXG4gIERvY2tlckltYWdlQXNzZXRTb3VyY2UsXG4gIEZpbGVBc3NldExvY2F0aW9uLFxuICBGaWxlQXNzZXRTb3VyY2UsXG4gIElCb3VuZFN0YWNrU3ludGhlc2l6ZXIgYXMgSUJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyLFxuICBJUmV1c2FibGVTdGFja1N5bnRoZXNpemVyLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgU3RhY2ssXG4gIFN0YWNrU3ludGhlc2l6ZXIsXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciwgdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IEJvb3RzdHJhcFJvbGUsIEJvb3RzdHJhcFJvbGVzLCBEZXBsb3ltZW50SWRlbnRpdGllcyB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IERlZmF1bHRTdGFnaW5nU3RhY2ssIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zIH0gZnJvbSAnLi9kZWZhdWx0LXN0YWdpbmctc3RhY2snO1xuaW1wb3J0IHsgUGVyRW52aXJvbm1lbnRTdGFnaW5nRmFjdG9yeSBhcyBQZXJFbnZpcm9ubWVudFN0YWdpbmdGYWN0b3J5IH0gZnJvbSAnLi9wZXItZW52LXN0YWdpbmctZmFjdG9yeSc7XG5pbXBvcnQgeyBBcHBTY29wZWRHbG9iYWwgfSBmcm9tICcuL3ByaXZhdGUvYXBwLWdsb2JhbCc7XG5pbXBvcnQgeyB2YWxpZGF0ZU5vVG9rZW5zIH0gZnJvbSAnLi9wcml2YXRlL25vLXRva2Vucyc7XG5pbXBvcnQgeyBJU3RhZ2luZ1Jlc291cmNlcywgSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5LCBPYnRhaW5TdGFnaW5nUmVzb3VyY2VzQ29udGV4dCB9IGZyb20gJy4vc3RhZ2luZy1zdGFjayc7XG5cbmNvbnN0IEFHTk9TVElDX1NUQUNLUyA9IG5ldyBBcHBTY29wZWRHbG9iYWwoKCkgPT4gbmV3IFNldDxTdGFjaz4oKSk7XG5jb25zdCBFTlZfQVdBUkVfU1RBQ0tTID0gbmV3IEFwcFNjb3BlZEdsb2JhbCgoKSA9PiBuZXcgU2V0PFN0YWNrPigpKTtcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgYXBwbHkgdG8gYWxsIEFwcFN0YWdpbmdTeW50aGVzaXplciB2YXJpYW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCByb2xlcyB0byB1c2UgdG8gZGVwbG95IGFwcGxpY2F0aW9uc1xuICAgKlxuICAgKiBUaGVzZSBhcmUgdGhlIHJvbGVzIHRoYXQgaGF2ZSBwZXJtaXNzaW9ucyB0byBpbnRlcmFjdCB3aXRoIENsb3VkRm9ybWF0aW9uXG4gICAqIG9uIHlvdXIgYmVoYWxmLiBCeSBkZWZhdWx0IHRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgYm9vdHN0cmFwcGVkIENESyByb2xlcyxcbiAgICogYnV0IHlvdSBjYW4gY3VzdG9taXplIHRoZW0gb3IgdHVybiB0aGVtIG9mZiBhbmQgdXNlIHRoZSBDTEkgY3JlZGVudGlhbHNcbiAgICogdG8gZGVwbG95LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBzdGFuZGFyZCBib290c3RyYXBwZWQgQ0RLIHJvbGVzXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50SWRlbnRpdGllcz86IERlcGxveW1lbnRJZGVudGl0aWVzO1xuXG4gIC8qKlxuICAgKiBRdWFsaWZpZXIgdG8gZGlzYW1iaWd1YXRlIG11bHRpcGxlIGJvb3RzdHJhcHBlZCBlbnZpcm9ubWVudHMgaW4gdGhlIHNhbWUgYWNjb3VudFxuICAgKlxuICAgKiBUaGlzIHF1YWxpZmllciBpcyBvbmx5IHVzZWQgdG8gcmVmZXJlbmNlIGJvb3RzdHJhcHBlZCByZXNvdXJjZXMuIEl0IHdpbGwgbm90XG4gICAqIGJlIHVzZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFwcC1zcGVjaWZpYyBzdGFnaW5nIHJlc291cmNlczogYGFwcElkYCBpcyB1c2VkIGZvciB0aGF0XG4gICAqIGluc3RlYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVmFsdWUgb2YgY29udGV4dCBrZXkgJ0Bhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyJyBpZiBzZXQsIG90aGVyd2lzZSBgREVGQVVMVF9RVUFMSUZJRVJgXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBRdWFsaWZpZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3Igc3RhY2tQZXJFbnYgc3RhdGljIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRSZXNvdXJjZXNPcHRpb25zIGV4dGVuZHMgQXBwU3RhZ2luZ1N5bnRoZXNpemVyT3B0aW9ucywgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge31cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjdXN0b21GYWN0b3J5IHN0YXRpYyBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21GYWN0b3J5T3B0aW9ucyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGZhY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHN0YWdpbmcgcmVzb3VyY2VzIGZvciBlYWNoIHN0YWNrXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5OiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIFJldXNlIHRoZSBhbnN3ZXIgZnJvbSB0aGUgZmFjdG9yeSBmb3Igc3RhY2tzIGluIHRoZSBzYW1lIGVudmlyb25tZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IG9uY2VQZXJFbnY/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGN1c3RvbVJlc291cmNlcyBzdGF0aWMgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VzT3B0aW9ucyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogVXNlIHRoZXNlIGV4YWN0IHN0YWdpbmcgcmVzb3VyY2VzIGZvciBldmVyeSBzdGFjayB0aGF0IHRoaXMgc3ludGhlc2l6ZXIgaXMgdXNlZCBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlczogSVN0YWdpbmdSZXNvdXJjZXM7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgcHJvcGVydGllcyBmb3IgQXBwU3RhZ2luZ1N5bnRoZXNpemVyXG4gKi9cbmludGVyZmFjZSBBcHBTdGFnaW5nU3ludGhlc2l6ZXJQcm9wcyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogQSBmYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gSVN0YWdpbmdTdGFjayB3aGVuIGdpdmVuIHRoZSBzdGFjayB0aGVcbiAgICogc3ludGhlc2l6ZXIgaXMgYmluZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGZhY3Rvcnk6IElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBBcHAgU3RhZ2luZyBTeW50aGVzaXplclxuICovXG5leHBvcnQgY2xhc3MgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIGV4dGVuZHMgU3RhY2tTeW50aGVzaXplciBpbXBsZW1lbnRzIElSZXVzYWJsZVN0YWNrU3ludGhlc2l6ZXIge1xuICAvKipcbiAgICogRGVmYXVsdCBBUk4gcXVhbGlmaWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUVVBTElGSUVSID0gJ2huYjY1OWZkcyc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgQ2xvdWRGb3JtYXRpb24gcm9sZSBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4gPSAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstJHtRdWFsaWZpZXJ9LWNmbi1leGVjLXJvbGUtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0nO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRlcGxveSByb2xlIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9ERVBMT1lfUk9MRV9BUk4gPSAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstJHtRdWFsaWZpZXJ9LWRlcGxveS1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259JztcblxuICAvKipcbiAgICogRGVmYXVsdCBsb29rdXAgcm9sZSBBUk4gZm9yIG1pc3NpbmcgdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPT0tVUF9ST0xFX0FSTiA9ICdhcm46JHtBV1M6OlBhcnRpdGlvbn06aWFtOjoke0FXUzo6QWNjb3VudElkfTpyb2xlL2Nkay0ke1F1YWxpZmllcn0tbG9va3VwLXJvbGUtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0nO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIERlZmF1bHQgU3RhZ2luZyBSZXNvdXJjZXMsIGNyZWF0aW5nIGEgc2luZ2xlIHN0YWNrIHBlciBlbnZpcm9ubWVudCB0aGlzIGFwcCBpcyBkZXBsb3llZCBpblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UmVzb3VyY2VzKG9wdGlvbnM6IERlZmF1bHRSZXNvdXJjZXNPcHRpb25zKSB7XG4gICAgdmFsaWRhdGVOb1Rva2VucyhvcHRpb25zLCAnQXBwU3RhZ2luZ1N5bnRoZXNpemVyJyk7XG5cbiAgICByZXR1cm4gQXBwU3RhZ2luZ1N5bnRoZXNpemVyLmN1c3RvbUZhY3Rvcnkoe1xuICAgICAgZmFjdG9yeTogRGVmYXVsdFN0YWdpbmdTdGFjay5mYWN0b3J5KG9wdGlvbnMpLFxuICAgICAgZGVwbG95bWVudElkZW50aXRpZXM6IG9wdGlvbnMuZGVwbG95bWVudElkZW50aXRpZXMsXG4gICAgICBib290c3RyYXBRdWFsaWZpZXI6IG9wdGlvbnMuYm9vdHN0cmFwUXVhbGlmaWVyLFxuICAgICAgb25jZVBlckVudjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhlc2UgZXhhY3Qgc3RhZ2luZyByZXNvdXJjZXMgZm9yIGV2ZXJ5IHN0YWNrIHRoYXQgdGhpcyBzeW50aGVzaXplciBpcyB1c2VkIGZvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b21SZXNvdXJjZXMob3B0aW9uczogQ3VzdG9tUmVzb3VyY2VzT3B0aW9ucykge1xuICAgIHJldHVybiBBcHBTdGFnaW5nU3ludGhlc2l6ZXIuY3VzdG9tRmFjdG9yeSh7XG4gICAgICBkZXBsb3ltZW50SWRlbnRpdGllczogb3B0aW9ucy5kZXBsb3ltZW50SWRlbnRpdGllcyxcbiAgICAgIGJvb3RzdHJhcFF1YWxpZmllcjogb3B0aW9ucy5ib290c3RyYXBRdWFsaWZpZXIsXG4gICAgICBvbmNlUGVyRW52OiBmYWxzZSxcbiAgICAgIGZhY3Rvcnk6IHtcbiAgICAgICAgb2J0YWluU3RhZ2luZ1Jlc291cmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXNvdXJjZXM7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBzdGFnaW5nU3RhY2tGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gSVN0YWdpbmdTdGFjayB3aGVuXG4gICAqIGEgc3RhY2sgaXMgYm91bmQgdG8gdGhlIHN5bnRoZXNpemVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBgb25jZVBlckVudiA9IHRydWVgLCB3aGljaCBtZWFucyB0aGF0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBJU3RhZ2luZ1N0YWNrXG4gICAqIHdpbGwgYmUgY3JlYXRlZCBpbiBuZXcgZW52aXJvbm1lbnRzLiBTZXQgYG9uY2VQZXJFbnYgPSBmYWxzZWAgdG8gdHVybiBvZmYgdGhhdCBiZWhhdmlvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3VzdG9tRmFjdG9yeShvcHRpb25zOiBDdXN0b21GYWN0b3J5T3B0aW9ucykge1xuICAgIGNvbnN0IG9uY2VQZXJFbnYgPSBvcHRpb25zLm9uY2VQZXJFbnYgPz8gdHJ1ZTtcbiAgICBjb25zdCBmYWN0b3J5ID0gb25jZVBlckVudiA/IG5ldyBQZXJFbnZpcm9ubWVudFN0YWdpbmdGYWN0b3J5KG9wdGlvbnMuZmFjdG9yeSkgOiBvcHRpb25zLmZhY3Rvcnk7XG5cbiAgICByZXR1cm4gbmV3IEFwcFN0YWdpbmdTeW50aGVzaXplcih7XG4gICAgICBmYWN0b3J5LFxuICAgICAgYm9vdHN0cmFwUXVhbGlmaWVyOiBvcHRpb25zLmJvb3RzdHJhcFF1YWxpZmllcixcbiAgICAgIGRlcGxveW1lbnRJZGVudGl0aWVzOiBvcHRpb25zLmRlcGxveW1lbnRJZGVudGl0aWVzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSByb2xlczogUmVxdWlyZWQ8Qm9vdHN0cmFwUm9sZXM+O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogQXBwU3RhZ2luZ1N5bnRoZXNpemVyUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yb2xlcyA9IHtcbiAgICAgIGRlcGxveW1lbnRSb2xlOiBwcm9wcy5kZXBsb3ltZW50SWRlbnRpdGllcz8ucm9sZXMuZGVwbG95bWVudFJvbGUgPz9cbiAgICAgICAgQm9vdHN0cmFwUm9sZS5mcm9tUm9sZUFybihBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9ERVBMT1lfUk9MRV9BUk4pLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBwcm9wcy5kZXBsb3ltZW50SWRlbnRpdGllcz8ucm9sZXMuY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlID8/XG4gICAgICAgIEJvb3RzdHJhcFJvbGUuZnJvbVJvbGVBcm4oQXBwU3RhZ2luZ1N5bnRoZXNpemVyLkRFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4pLFxuICAgICAgbG9va3VwUm9sZTogdGhpcy5wcm9wcy5kZXBsb3ltZW50SWRlbnRpdGllcz8ucm9sZXMubG9va3VwUm9sZSA/P1xuICAgICAgICBCb290c3RyYXBSb2xlLmZyb21Sb2xlQXJuKEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX0xPT0tVUF9ST0xFX0FSTiksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3ludGhlc2l6ZXIgYm91bmQgdG8gYSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyByZXVzYWJsZUJpbmQoc3RhY2s6IFN0YWNrKTogSUJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyIHtcbiAgICB0aGlzLmNoZWNrRW52aXJvbm1lbnRHbm9zdGljaXNtKHN0YWNrKTtcbiAgICBjb25zdCBxdWFsaWZpZXIgPSB0aGlzLnByb3BzLmJvb3RzdHJhcFF1YWxpZmllciA/P1xuICAgICAgc3RhY2subm9kZS50cnlHZXRDb250ZXh0KEJPT1RTVFJBUF9RVUFMSUZJRVJfQ09OVEVYVCkgPz9cbiAgICAgIEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX1FVQUxJRklFUjtcbiAgICBjb25zdCBzcGVjID0gbmV3IFN0cmluZ1NwZWNpYWxpemVyKHN0YWNrLCBxdWFsaWZpZXIpO1xuXG4gICAgY29uc3QgZGVwbG95Um9sZSA9IHRoaXMucm9sZXMuZGVwbG95bWVudFJvbGUuX3NwZWNpYWxpemUoc3BlYyk7XG5cbiAgICBjb25zdCBjb250ZXh0OiBPYnRhaW5TdGFnaW5nUmVzb3VyY2VzQ29udGV4dCA9IHtcbiAgICAgIGVudmlyb25tZW50U3RyaW5nOiBbXG4gICAgICAgIFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5hY2NvdW50KSA/ICdBQ0NPVU5UJyA6IHN0YWNrLmFjY291bnQsXG4gICAgICAgIFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5yZWdpb24pID8gJ1JFR0lPTicgOiBzdGFjay5yZWdpb24sXG4gICAgICBdLmpvaW4oJy0nKSxcbiAgICAgIGRlcGxveVJvbGVBcm46IGRlcGxveVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCksXG4gICAgICBxdWFsaWZpZXIsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIoc3RhY2ssIHtcbiAgICAgIHN0YWdpbmdSZXNvdXJjZXM6IHRoaXMucHJvcHMuZmFjdG9yeS5vYnRhaW5TdGFnaW5nUmVzb3VyY2VzKHN0YWNrLCBjb250ZXh0KSxcbiAgICAgIGRlcGxveVJvbGUsXG4gICAgICBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IHRoaXMucm9sZXMuY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlLl9zcGVjaWFsaXplKHNwZWMpLFxuICAgICAgbG9va3VwUm9sZTogdGhpcy5yb2xlcy5sb29rdXBSb2xlLl9zcGVjaWFsaXplKHNwZWMpLFxuICAgICAgcXVhbGlmaWVyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgYmluZChfc3RhY2s6IFN0YWNrKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGEgbGVnYWN5IEFQSSwgY2FsbCByZXVzYWJsZUJpbmQgaW5zdGVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3ludGhlc2l6ZShfc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYSBsZWdhY3kgQVBJLCBjYWxsIHJldXNhYmxlQmluZCBpbnN0ZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgZm9yIGxlZ2FjeSBwdXJwb3NlczsgdGhpcyB3aWxsIG5ldmVyIGJlIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlQXNzZXQoX2Fzc2V0OiBGaWxlQXNzZXRTb3VyY2UpOiBGaWxlQXNzZXRMb2NhdGlvbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGEgbGVnYWN5IEFQSSwgY2FsbCByZXVzYWJsZUJpbmQgaW5zdGVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkRG9ja2VySW1hZ2VBc3NldChfYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24ge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhIGxlZ2FjeSBBUEksIGNhbGwgcmV1c2FibGVCaW5kIGluc3RlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGF0IHdlJ3JlIG9ubHkgYmVpbmcgdXNlZCBmb3IgZXhjbHVzaXZlbHkgZ25vc3RpYyBvciBhZ25vc3RpYyBzdGFja3MuXG4gICAqXG4gICAqIFdlIGNhbiB0aGluayBhYm91dCB3aGV0aGVyIHRvIGxvb3NlbiB0aGlzIHJlcXVpcmVtZW50IGxhdGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0Vudmlyb25tZW50R25vc3RpY2lzbShzdGFjazogU3RhY2spIHtcbiAgICBjb25zdCBpc0Fnbm9zdGljID0gVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrLmFjY291bnQpIHx8IFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5yZWdpb24pO1xuICAgIGNvbnN0IGFnbm9zdGljU3RhY2tzID0gQUdOT1NUSUNfU1RBQ0tTLmZvcihzdGFjayk7XG4gICAgY29uc3QgZW52QXdhcmVTdGFja3MgPSBFTlZfQVdBUkVfU1RBQ0tTLmZvcihzdGFjayk7XG5cbiAgICAoaXNBZ25vc3RpYyA/IGFnbm9zdGljU3RhY2tzIDogZW52QXdhcmVTdGFja3MpLmFkZChzdGFjayk7XG4gICAgaWYgKGFnbm9zdGljU3RhY2tzLnNpemUgPiAwICYmIGVudkF3YXJlU3RhY2tzLnNpemUgPiAwKSB7XG5cbiAgICAgIGNvbnN0IGRlc2NyaWJlU3RhY2tzID0gKHhzOiBTZXQ8U3RhY2s+KSA9PiBBcnJheS5mcm9tKHhzKS5tYXAocyA9PiBzLm5vZGUucGF0aCkuam9pbignLCAnKTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgJ0l0IGlzIG5vdCBzYWZlIHRvIHVzZSBBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZm9yIGJvdGggZW52aXJvbm1lbnQtYWdub3N0aWMgYW5kIGVudmlyb25tZW50LWF3YXJlIHN0YWNrcyBhdCB0aGUgc2FtZSB0aW1lLicsXG4gICAgICAgICdQbGVhc2UgZWl0aGVyIHNwZWNpZnkgZW52aXJvbm1lbnRzIGZvciBhbGwgc3RhY2tzIG9yIG5vIHN0YWNrcyBpbiB0aGUgQ0RLIEFwcC4nLFxuICAgICAgICBgU3RhY2tzIHdpdGggZW52aXJvbm1lbnQ6ICR7ZGVzY3JpYmVTdGFja3MoYWdub3N0aWNTdGFja3MpfS5gLFxuICAgICAgICBgU3RhY2tzIHdpdGhvdXQgZW52aXJvbm1lbnQ6ICR7ZGVzY3JpYmVTdGFja3MoZW52QXdhcmVTdGFja3MpfS5gLFxuICAgICAgXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEludGVybmFsIHByb3BlcnRpZXMgZm9yIEJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyXG4gKi9cbmludGVyZmFjZSBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBib290c3RyYXAgcXVhbGlmaWVyXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlcyB3ZSBlbmQgdXAgdXNpbmcgZm9yIHRoaXMgc3ludGhlc2l6ZXJcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmdSZXNvdXJjZXM6IElTdGFnaW5nUmVzb3VyY2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveVJvbGU6IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIENsb3VkRm9ybWF0aW9uIEV4ZWN1dGlvbiBSb2xlXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBSb2xlXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlOiBCb290c3RyYXBSb2xlO1xufVxuXG5jbGFzcyBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplciBleHRlbmRzIFN0YWNrU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdpbmdTdGFjazogSVN0YWdpbmdSZXNvdXJjZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRNYW5pZmVzdCA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY3lTdGFja3M6IFNldDxTdGFjaz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3Ioc3RhY2s6IFN0YWNrLCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplclByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBzdXBlci5iaW5kKHN0YWNrKTtcblxuICAgIHRoaXMucXVhbGlmaWVyID0gcHJvcHMucXVhbGlmaWVyO1xuICAgIHRoaXMuc3RhZ2luZ1N0YWNrID0gcHJvcHMuc3RhZ2luZ1Jlc291cmNlcztcbiAgfVxuICAvKipcbiAgICogVGhlIHF1YWxpZmllciB1c2VkIHRvIGJvb3RzdHJhcCB0aGlzIHN0YWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJvb3RzdHJhcFF1YWxpZmllcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRoaXMuXG4gICAgcmV0dXJuIHRoaXMucXVhbGlmaWVyO1xuICB9XG5cbiAgcHVibGljIHN5bnRoZXNpemUoc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24pOiB2b2lkIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUFzc2V0U291cmNlID0gdGhpcy5zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbiwgdGhpcy5wcm9wcy5sb29rdXBSb2xlPy5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpKTtcbiAgICBjb25zdCB0ZW1wbGF0ZUFzc2V0ID0gdGhpcy5hZGRGaWxlQXNzZXQodGVtcGxhdGVBc3NldFNvdXJjZSk7XG5cbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBBcnJheS5mcm9tKHRoaXMuZGVwZW5kZW5jeVN0YWNrcykuZmxhdE1hcCgoZCkgPT4gZC5hcnRpZmFjdElkKTtcbiAgICBjb25zdCBhc3NldE1hbmlmZXN0SWQgPSB0aGlzLmFzc2V0TWFuaWZlc3QuZW1pdE1hbmlmZXN0KHRoaXMuYm91bmRTdGFjaywgc2Vzc2lvbiwge30sIGRlcGVuZGVuY2llcyk7XG5cbiAgICBjb25zdCBsb29rdXBSb2xlQXJuID0gdGhpcy5wcm9wcy5sb29rdXBSb2xlPy5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpO1xuXG4gICAgdGhpcy5lbWl0QXJ0aWZhY3Qoc2Vzc2lvbiwge1xuICAgICAgYXNzdW1lUm9sZUFybjogdGhpcy5wcm9wcy5kZXBsb3lSb2xlPy5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpLFxuICAgICAgYWRkaXRpb25hbERlcGVuZGVuY2llczogW2Fzc2V0TWFuaWZlc3RJZF0sXG4gICAgICBzdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmw6IHRlbXBsYXRlQXNzZXQuczNPYmplY3RVcmxXaXRoUGxhY2Vob2xkZXJzLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuOiB0aGlzLnByb3BzLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKSxcbiAgICAgIGxvb2t1cFJvbGU6IGxvb2t1cFJvbGVBcm4gPyB7IGFybjogbG9va3VwUm9sZUFybiB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGZpbGUgYXNzZXQgdG8gdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcHVibGljIGFkZEZpbGVBc3NldChhc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZUFzc2V0TG9jYXRpb24ge1xuICAgIGNvbnN0IHsgYnVja2V0TmFtZSwgYXNzdW1lUm9sZUFybiwgcHJlZml4LCBkZXBlbmRlbmN5U3RhY2sgfSA9IHRoaXMuc3RhZ2luZ1N0YWNrLmFkZEZpbGUoYXNzZXQpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hc3NldE1hbmlmZXN0LmRlZmF1bHRBZGRGaWxlQXNzZXQodGhpcy5ib3VuZFN0YWNrLCBhc3NldCwge1xuICAgICAgYnVja2V0TmFtZTogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4oYnVja2V0TmFtZSksXG4gICAgICBidWNrZXRQcmVmaXg6IHByZWZpeCxcbiAgICAgIHJvbGU6IGFzc3VtZVJvbGVBcm4gPyB7IGFzc3VtZVJvbGVBcm46IHRyYW5zbGF0ZUNmblRva2VuVG9Bc3NldFRva2VuKGFzc3VtZVJvbGVBcm4pIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBpZiAoZGVwZW5kZW5jeVN0YWNrKSB7XG4gICAgICB0aGlzLmJvdW5kU3RhY2suYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5U3RhY2ssICdzdGFjayBkZXBlbmRzIG9uIHRoZSBzdGFnaW5nIHN0YWNrIGZvciBzdGFnaW5nIHJlc291cmNlcycpO1xuICAgICAgdGhpcy5kZXBlbmRlbmN5U3RhY2tzLmFkZChkZXBlbmRlbmN5U3RhY2spO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb3VkRm9ybWF0aW9uTG9jYXRpb25Gcm9tRmlsZUFzc2V0KGxvY2F0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBkb2NrZXIgaW1hZ2UgYXNzZXQgdG8gdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcHVibGljIGFkZERvY2tlckltYWdlQXNzZXQoYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24ge1xuICAgIGNvbnN0IHsgcmVwb05hbWUsIGFzc3VtZVJvbGVBcm4sIGRlcGVuZGVuY3lTdGFjayB9ID0gdGhpcy5zdGFnaW5nU3RhY2suYWRkRG9ja2VySW1hZ2UoYXNzZXQpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hc3NldE1hbmlmZXN0LmRlZmF1bHRBZGREb2NrZXJJbWFnZUFzc2V0KHRoaXMuYm91bmRTdGFjaywgYXNzZXQsIHtcbiAgICAgIHJlcG9zaXRvcnlOYW1lOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbihyZXBvTmFtZSksXG4gICAgICByb2xlOiBhc3N1bWVSb2xlQXJuID8geyBhc3N1bWVSb2xlQXJuOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbihhc3N1bWVSb2xlQXJuKSB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKGRlcGVuZGVuY3lTdGFjaykge1xuICAgICAgdGhpcy5ib3VuZFN0YWNrLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeVN0YWNrLCAnc3RhY2sgZGVwZW5kcyBvbiB0aGUgc3RhZ2luZyBzdGFjayBmb3Igc3RhZ2luZyByZXNvdXJjZXMnKTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrcy5hZGQoZGVwZW5kZW5jeVN0YWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG91ZEZvcm1hdGlvbkxvY2F0aW9uRnJvbURvY2tlckltYWdlQXNzZXQobG9jYXRpb24pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,93 @@
1
+ import { StringSpecializer } from 'aws-cdk-lib/core/lib/helpers-internal';
2
+ /**
3
+ * Bootstrapped role specifier. These roles must exist already.
4
+ * This class does not create new IAM Roles.
5
+ */
6
+ export declare class BootstrapRole {
7
+ private readonly roleArn;
8
+ /**
9
+ * Use the currently assumed role/credentials
10
+ */
11
+ static cliCredentials(): BootstrapRole;
12
+ /**
13
+ * Specify an existing IAM Role to assume
14
+ */
15
+ static fromRoleArn(arn: string): BootstrapRole;
16
+ private static CLI_CREDS;
17
+ private constructor();
18
+ /**
19
+ * Whether or not this is object was created using BootstrapRole.cliCredentials()
20
+ */
21
+ isCliCredentials(): boolean;
22
+ /**
23
+ * @internal
24
+ */
25
+ _arnForCloudFormation(): string | undefined;
26
+ /**
27
+ * @internal
28
+ */
29
+ _arnForCloudAssembly(): string | undefined;
30
+ /**
31
+ * @internal
32
+ */
33
+ _specialize(spec: StringSpecializer): BootstrapRole;
34
+ }
35
+ /**
36
+ * Deployment identities are the class of roles to be assumed by the CDK
37
+ * when deploying the App.
38
+ */
39
+ export declare class DeploymentIdentities {
40
+ /** roles that are bootstrapped to your account. */
41
+ readonly roles: BootstrapRoles;
42
+ /**
43
+ * Use CLI credentials for all deployment identities.
44
+ */
45
+ static cliCredentials(): DeploymentIdentities;
46
+ /**
47
+ * Specify your own roles for all deployment identities. These roles
48
+ * must already exist.
49
+ */
50
+ static specifyRoles(roles: BootstrapRoles): DeploymentIdentities;
51
+ private constructor();
52
+ }
53
+ /**
54
+ * Roles that are bootstrapped to your account.
55
+ */
56
+ export interface BootstrapRoles {
57
+ /**
58
+ * CloudFormation Execution Role
59
+ *
60
+ * @default - use bootstrapped role
61
+ */
62
+ readonly cloudFormationExecutionRole?: BootstrapRole;
63
+ /**
64
+ * Deployment Action Role
65
+ *
66
+ * @default - use boostrapped role
67
+ */
68
+ readonly deploymentRole?: BootstrapRole;
69
+ /**
70
+ * Lookup Role
71
+ *
72
+ * @default - use bootstrapped role
73
+ */
74
+ readonly lookupRole?: BootstrapRole;
75
+ }
76
+ /**
77
+ * Roles that are included in the Staging Stack
78
+ * (for access to Staging Resources)
79
+ */
80
+ export interface StagingRoles {
81
+ /**
82
+ * File Asset Publishing Role
83
+ *
84
+ * @default - staging stack creates a file asset publishing role
85
+ */
86
+ readonly fileAssetPublishingRole?: BootstrapRole;
87
+ /**
88
+ * Docker Asset Publishing Role
89
+ *
90
+ * @default - staging stack creates a docker asset publishing role
91
+ */
92
+ readonly dockerAssetPublishingRole?: BootstrapRole;
93
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var _a, _b;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DeploymentIdentities = exports.BootstrapRole = void 0;
5
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
8
+ /**
9
+ * Bootstrapped role specifier. These roles must exist already.
10
+ * This class does not create new IAM Roles.
11
+ */
12
+ class BootstrapRole {
13
+ /**
14
+ * Use the currently assumed role/credentials
15
+ */
16
+ static cliCredentials() {
17
+ return new BootstrapRole(BootstrapRole.CLI_CREDS);
18
+ }
19
+ /**
20
+ * Specify an existing IAM Role to assume
21
+ */
22
+ static fromRoleArn(arn) {
23
+ helpers_internal_1.StringSpecializer.validateNoTokens(arn, 'BootstrapRole ARN');
24
+ return new BootstrapRole(arn);
25
+ }
26
+ constructor(roleArn) {
27
+ this.roleArn = roleArn;
28
+ }
29
+ /**
30
+ * Whether or not this is object was created using BootstrapRole.cliCredentials()
31
+ */
32
+ isCliCredentials() {
33
+ return this.roleArn === BootstrapRole.CLI_CREDS;
34
+ }
35
+ /**
36
+ * @internal
37
+ */
38
+ _arnForCloudFormation() {
39
+ return this.isCliCredentials() ? undefined : (0, helpers_internal_1.translateAssetTokenToCfnToken)(this.roleArn);
40
+ }
41
+ /**
42
+ * @internal
43
+ */
44
+ _arnForCloudAssembly() {
45
+ return this.isCliCredentials() ? undefined : (0, helpers_internal_1.translateCfnTokenToAssetToken)(this.roleArn);
46
+ }
47
+ /**
48
+ * @internal
49
+ */
50
+ _specialize(spec) {
51
+ return new BootstrapRole(spec.specialize(this.roleArn));
52
+ }
53
+ }
54
+ _a = JSII_RTTI_SYMBOL_1;
55
+ BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.82.0-alpha.0" };
56
+ BootstrapRole.CLI_CREDS = 'cli-credentials';
57
+ exports.BootstrapRole = BootstrapRole;
58
+ /**
59
+ * Deployment identities are the class of roles to be assumed by the CDK
60
+ * when deploying the App.
61
+ */
62
+ class DeploymentIdentities {
63
+ /**
64
+ * Use CLI credentials for all deployment identities.
65
+ */
66
+ static cliCredentials() {
67
+ return new DeploymentIdentities({
68
+ cloudFormationExecutionRole: BootstrapRole.cliCredentials(),
69
+ deploymentRole: BootstrapRole.cliCredentials(),
70
+ lookupRole: BootstrapRole.cliCredentials(),
71
+ });
72
+ }
73
+ /**
74
+ * Specify your own roles for all deployment identities. These roles
75
+ * must already exist.
76
+ */
77
+ static specifyRoles(roles) {
78
+ try {
79
+ jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_BootstrapRoles(roles);
80
+ }
81
+ catch (error) {
82
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
83
+ Error.captureStackTrace(error, this.specifyRoles);
84
+ }
85
+ throw error;
86
+ }
87
+ return new DeploymentIdentities(roles);
88
+ }
89
+ constructor(
90
+ /** roles that are bootstrapped to your account. */
91
+ roles) {
92
+ this.roles = roles;
93
+ }
94
+ }
95
+ _b = JSII_RTTI_SYMBOL_1;
96
+ DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.82.0-alpha.0" };
97
+ exports.DeploymentIdentities = DeploymentIdentities;
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLXJvbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRFQUF3STtBQUV4STs7O0dBR0c7QUFDSCxNQUFhLGFBQWE7SUFDeEI7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYztRQUMxQixPQUFPLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNuRDtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFXO1FBQ25DLG9DQUFpQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDL0I7SUFJRCxZQUFxQyxPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtLQUFJO0lBRXhEOztPQUVHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsU0FBUyxDQUFDO0tBQ2pEO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdEQUE2QixFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMxRjtJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnREFBNkIsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDMUY7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxJQUF1QjtRQUN4QyxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDekQ7Ozs7QUE5QmMsdUJBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQWhCbEMsc0NBQWE7QUFpRDFCOzs7R0FHRztBQUNILE1BQWEsb0JBQW9CO0lBQy9COztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxJQUFJLG9CQUFvQixDQUFDO1lBQzlCLDJCQUEyQixFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDM0QsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDOUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7U0FDM0MsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQXFCOzs7Ozs7Ozs7O1FBQzlDLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QztJQUVEO0lBQ0UsbURBQW1EO0lBQ25DLEtBQXFCO1FBQXJCLFVBQUssR0FBTCxLQUFLLENBQWdCO0tBQ25DOzs7O0FBdkJPLG9EQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0cmluZ1NwZWNpYWxpemVyLCB0cmFuc2xhdGVBc3NldFRva2VuVG9DZm5Ub2tlbiwgdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcblxuLyoqXG4gKiBCb290c3RyYXBwZWQgcm9sZSBzcGVjaWZpZXIuIFRoZXNlIHJvbGVzIG11c3QgZXhpc3QgYWxyZWFkeS5cbiAqIFRoaXMgY2xhc3MgZG9lcyBub3QgY3JlYXRlIG5ldyBJQU0gUm9sZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBSb2xlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgY3VycmVudGx5IGFzc3VtZWQgcm9sZS9jcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGlDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJvbGUoQm9vdHN0cmFwUm9sZS5DTElfQ1JFRFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYW4gZXhpc3RpbmcgSUFNIFJvbGUgdG8gYXNzdW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlQXJuKGFybjogc3RyaW5nKSB7XG4gICAgU3RyaW5nU3BlY2lhbGl6ZXIudmFsaWRhdGVOb1Rva2Vucyhhcm4sICdCb290c3RyYXBSb2xlIEFSTicpO1xuICAgIHJldHVybiBuZXcgQm9vdHN0cmFwUm9sZShhcm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgQ0xJX0NSRURTID0gJ2NsaS1jcmVkZW50aWFscyc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZykge31cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhpcyBpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgdXNpbmcgQm9vdHN0cmFwUm9sZS5jbGlDcmVkZW50aWFscygpXG4gICAqL1xuICBwdWJsaWMgaXNDbGlDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlQXJuID09PSBCb290c3RyYXBSb2xlLkNMSV9DUkVEUztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXJuRm9yQ2xvdWRGb3JtYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGlDcmVkZW50aWFscygpID8gdW5kZWZpbmVkIDogdHJhbnNsYXRlQXNzZXRUb2tlblRvQ2ZuVG9rZW4odGhpcy5yb2xlQXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXJuRm9yQ2xvdWRBc3NlbWJseSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NsaUNyZWRlbnRpYWxzKCkgPyB1bmRlZmluZWQgOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbih0aGlzLnJvbGVBcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zcGVjaWFsaXplKHNwZWM6IFN0cmluZ1NwZWNpYWxpemVyKSB7XG4gICAgcmV0dXJuIG5ldyBCb290c3RyYXBSb2xlKHNwZWMuc3BlY2lhbGl6ZSh0aGlzLnJvbGVBcm4pKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcGxveW1lbnQgaWRlbnRpdGllcyBhcmUgdGhlIGNsYXNzIG9mIHJvbGVzIHRvIGJlIGFzc3VtZWQgYnkgdGhlIENES1xuICogd2hlbiBkZXBsb3lpbmcgdGhlIEFwcC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgLyoqXG4gICAqIFVzZSBDTEkgY3JlZGVudGlhbHMgZm9yIGFsbCBkZXBsb3ltZW50IGlkZW50aXRpZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsaUNyZWRlbnRpYWxzKCk6IERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgICByZXR1cm4gbmV3IERlcGxveW1lbnRJZGVudGl0aWVzKHtcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZTogQm9vdHN0cmFwUm9sZS5jbGlDcmVkZW50aWFscygpLFxuICAgICAgZGVwbG95bWVudFJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICAgIGxvb2t1cFJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHlvdXIgb3duIHJvbGVzIGZvciBhbGwgZGVwbG95bWVudCBpZGVudGl0aWVzLiBUaGVzZSByb2xlc1xuICAgKiBtdXN0IGFscmVhZHkgZXhpc3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWNpZnlSb2xlcyhyb2xlczogQm9vdHN0cmFwUm9sZXMpOiBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyhyb2xlcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKiByb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByb2xlczogQm9vdHN0cmFwUm9sZXMsXG4gICkge31cbn1cblxuLyoqXG4gKiBSb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFJvbGVzIHtcbiAgLyoqXG4gICAqIENsb3VkRm9ybWF0aW9uIEV4ZWN1dGlvbiBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGJvb3RzdHJhcHBlZCByb2xlXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IEFjdGlvbiBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGJvb3N0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogTG9va3VwIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGU/OiBCb290c3RyYXBSb2xlO1xufVxuXG4vKipcbiAqIFJvbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBTdGFnaW5nIFN0YWNrXG4gKiAoZm9yIGFjY2VzcyB0byBTdGFnaW5nIFJlc291cmNlcylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnaW5nUm9sZXMge1xuICAvKipcbiAgICogRmlsZSBBc3NldCBQdWJsaXNoaW5nIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdGFnaW5nIHN0YWNrIGNyZWF0ZXMgYSBmaWxlIGFzc2V0IHB1Ymxpc2hpbmcgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgQXNzZXQgUHVibGlzaGluZyBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3RhZ2luZyBzdGFjayBjcmVhdGVzIGEgZG9ja2VyIGFzc2V0IHB1Ymxpc2hpbmcgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG59XG4iXX0=
@@ -0,0 +1,151 @@
1
+ import { App, DockerImageAssetSource, Duration, FileAssetSource, ISynthesisSession, Stack, StackProps } from 'aws-cdk-lib';
2
+ import * as ecr from 'aws-cdk-lib/aws-ecr';
3
+ import * as s3 from 'aws-cdk-lib/aws-s3';
4
+ import { BootstrapRole } from './bootstrap-roles';
5
+ import { FileStagingLocation, IStagingResources, IStagingResourcesFactory, ImageStagingLocation } from './staging-stack';
6
+ export declare const DEPLOY_TIME_PREFIX = "deploy-time/";
7
+ /**
8
+ * User configurable options to the DefaultStagingStack.
9
+ */
10
+ export interface DefaultStagingStackOptions {
11
+ /**
12
+ * A unique identifier for the application that the staging stack belongs to.
13
+ *
14
+ * This identifier will be used in the name of staging resources
15
+ * created for this application, and should be unique across CDK apps.
16
+ *
17
+ * The identifier should include lowercase characters and dashes ('-') only
18
+ * and have a maximum of 20 characters.
19
+ */
20
+ readonly appId: string;
21
+ /**
22
+ * Explicit name for the staging bucket
23
+ *
24
+ * @default - a well-known name unique to this app/env.
25
+ */
26
+ readonly stagingBucketName?: string;
27
+ /**
28
+ * Pass in an existing role to be used as the file publishing role.
29
+ *
30
+ * @default - a new role will be created
31
+ */
32
+ readonly fileAssetPublishingRole?: BootstrapRole;
33
+ /**
34
+ * Pass in an existing role to be used as the image publishing role.
35
+ *
36
+ * @default - a new role will be created
37
+ */
38
+ readonly imageAssetPublishingRole?: BootstrapRole;
39
+ /**
40
+ * The lifetime for deploy time file assets.
41
+ *
42
+ * Assets that are only necessary at deployment time (for instance,
43
+ * CloudFormation templates and Lambda source code bundles) will be
44
+ * automatically deleted after this many days. Assets that may be
45
+ * read from the staging bucket during your application's run time
46
+ * will not be deleted.
47
+ *
48
+ * Set this to the length of time you wish to be able to roll back to
49
+ * previous versions of your application without having to do a new
50
+ * `cdk synth` and re-upload of assets.
51
+ *
52
+ * @default - Duration.days(30)
53
+ */
54
+ readonly deployTimeFileAssetLifetime?: Duration;
55
+ /**
56
+ * The maximum number of image versions to store in a repository.
57
+ *
58
+ * Previous versions of an image can be stored for rollback purposes.
59
+ * Once a repository has more than 3 image versions stored, the oldest
60
+ * version will be discarded. This allows for sensible garbage collection
61
+ * while maintaining a few previous versions for rollback scenarios.
62
+ *
63
+ * @default - up to 3 versions stored
64
+ */
65
+ readonly imageAssetVersionCount?: number;
66
+ }
67
+ /**
68
+ * Default Staging Stack Properties
69
+ */
70
+ export interface DefaultStagingStackProps extends DefaultStagingStackOptions, StackProps {
71
+ /**
72
+ * The ARN of the deploy action role, if given
73
+ *
74
+ * This role will need permissions to read from to the staging resources.
75
+ *
76
+ * @default - The CLI credentials are assumed, no additional permissions are granted.
77
+ */
78
+ readonly deployRoleArn?: string;
79
+ /**
80
+ * The qualifier used to specialize strings
81
+ *
82
+ * Shouldn't be necessary but who knows what people might do.
83
+ */
84
+ readonly qualifier: string;
85
+ }
86
+ /**
87
+ * A default Staging Stack that implements IStagingResources.
88
+ *
89
+ * @example
90
+ * const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
91
+ */
92
+ export declare class DefaultStagingStack extends Stack implements IStagingResources {
93
+ private readonly props;
94
+ /**
95
+ * Return a factory that will create DefaultStagingStacks
96
+ */
97
+ static factory(options: DefaultStagingStackOptions): IStagingResourcesFactory;
98
+ /**
99
+ * Default asset publishing role name for file (S3) assets.
100
+ */
101
+ private get fileRoleName();
102
+ /**
103
+ * Default asset publishing role name for docker (ECR) assets.
104
+ */
105
+ private get imageRoleName();
106
+ /**
107
+ * The app-scoped, evironment-keyed staging bucket.
108
+ */
109
+ readonly stagingBucket?: s3.Bucket;
110
+ /**
111
+ * The app-scoped, environment-keyed ecr repositories associated with this app.
112
+ */
113
+ readonly stagingRepos: Record<string, ecr.Repository>;
114
+ /**
115
+ * The stack to add dependencies to.
116
+ */
117
+ readonly dependencyStack: Stack;
118
+ private readonly appId;
119
+ private readonly stagingBucketName?;
120
+ /**
121
+ * File publish role ARN in asset manifest format
122
+ */
123
+ private readonly providedFileRole?;
124
+ private fileRole?;
125
+ private fileRoleManifestArn?;
126
+ /**
127
+ * Image publishing role ARN in asset manifest format
128
+ */
129
+ private readonly providedImageRole?;
130
+ private imageRole?;
131
+ private didImageRole;
132
+ private imageRoleManifestArn?;
133
+ private readonly deployRoleArn?;
134
+ constructor(scope: App, id: string, props: DefaultStagingStackProps);
135
+ private validateAppId;
136
+ private ensureFileRole;
137
+ private ensureImageRole;
138
+ private createBucketKey;
139
+ private getCreateBucket;
140
+ /**
141
+ * Returns the well-known name of the repo
142
+ */
143
+ private getCreateRepo;
144
+ addFile(asset: FileAssetSource): FileStagingLocation;
145
+ addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation;
146
+ /**
147
+ * Synthesizes the cloudformation template into a cloud assembly.
148
+ * @internal
149
+ */
150
+ _synthesizeTemplate(session: ISynthesisSession, lookupRoleArn?: string | undefined): void;
151
+ }