@aws-cdk/aws-imagebuilder-alpha 2.228.0-alpha.0 → 2.229.1-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,335 @@
1
+ "use strict";
2
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
3
+ var useValue = arguments.length > 2;
4
+ for (var i = 0; i < initializers.length; i++) {
5
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
6
+ }
7
+ return useValue ? value : void 0;
8
+ };
9
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
10
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
11
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
12
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
13
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
14
+ var _, done = false;
15
+ for (var i = decorators.length - 1; i >= 0; i--) {
16
+ var context = {};
17
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
18
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
19
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
20
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
21
+ if (kind === "accessor") {
22
+ if (result === void 0) continue;
23
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
24
+ if (_ = accept(result.get)) descriptor.get = _;
25
+ if (_ = accept(result.set)) descriptor.set = _;
26
+ if (_ = accept(result.init)) initializers.unshift(_);
27
+ }
28
+ else if (_ = accept(result)) {
29
+ if (kind === "field") initializers.unshift(_);
30
+ else descriptor[key] = _;
31
+ }
32
+ }
33
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
34
+ done = true;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ImageRecipe = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const cdk = require("aws-cdk-lib");
41
+ const iam = require("aws-cdk-lib/aws-iam");
42
+ const aws_imagebuilder_1 = require("aws-cdk-lib/aws-imagebuilder");
43
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
44
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
45
+ const IMAGE_RECIPE_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.ImageRecipe');
46
+ /**
47
+ * Represents the latest version of an image recipe. When using the recipe in a pipeline, the pipeline will use the
48
+ * latest recipe at the time of execution.
49
+ *
50
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
51
+ */
52
+ const LATEST_VERSION = 'x.x.x';
53
+ /**
54
+ * The default version to use in the image recipe. When the recipe is updated, the `x` will be incremented off from
55
+ * the latest recipe version that exists.
56
+ *
57
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html
58
+ */
59
+ const DEFAULT_RECIPE_VERSION = '1.0.x';
60
+ /**
61
+ * A new or imported Image Recipe
62
+ */
63
+ class ImageRecipeBase extends cdk.Resource {
64
+ /**
65
+ * Grant custom actions to the given grantee for the image recipe
66
+ *
67
+ * @param grantee The principal
68
+ * @param actions The list of actions
69
+ */
70
+ grant(grantee, ...actions) {
71
+ return iam.Grant.addToPrincipal({
72
+ grantee,
73
+ actions,
74
+ resourceArns: [this.imageRecipeArn],
75
+ scope: this,
76
+ });
77
+ }
78
+ /**
79
+ * Grant read permissions to the given grantee for the image recipe
80
+ *
81
+ * @param grantee The principal
82
+ */
83
+ grantRead(grantee) {
84
+ return this.grant(grantee, 'imagebuilder:GetImageRecipe');
85
+ }
86
+ /**
87
+ * Indicates whether the recipe is a Container Recipe
88
+ *
89
+ * @internal
90
+ */
91
+ _isContainerRecipe() {
92
+ return false;
93
+ }
94
+ /**
95
+ * Indicates whether the recipe is an Image Recipe
96
+ *
97
+ * @internal
98
+ */
99
+ _isImageRecipe() {
100
+ return true;
101
+ }
102
+ }
103
+ /**
104
+ * Represents an EC2 Image Builder Image Recipe.
105
+ *
106
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-recipes.html
107
+ */
108
+ let ImageRecipe = (() => {
109
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
110
+ let _classDescriptor;
111
+ let _classExtraInitializers = [];
112
+ let _classThis;
113
+ let _classSuper = ImageRecipeBase;
114
+ let _instanceExtraInitializers = [];
115
+ let _addBlockDevice_decorators;
116
+ var ImageRecipe = class extends _classSuper {
117
+ static { _classThis = this; }
118
+ static {
119
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
120
+ _addBlockDevice_decorators = [(0, metadata_resource_1.MethodMetadata)()];
121
+ __esDecorate(this, null, _addBlockDevice_decorators, { kind: "method", name: "addBlockDevice", static: false, private: false, access: { has: obj => "addBlockDevice" in obj, get: obj => obj.addBlockDevice }, metadata: _metadata }, null, _instanceExtraInitializers);
122
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
123
+ ImageRecipe = _classThis = _classDescriptor.value;
124
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
125
+ }
126
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ImageRecipe", version: "2.229.1-alpha.0" };
127
+ /** Uniquely identifies this class. */
128
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.ImageRecipe';
129
+ /**
130
+ * Import an existing image recipe given its ARN.
131
+ */
132
+ static fromImageRecipeArn(scope, id, imageRecipeArn) {
133
+ return this.fromImageRecipeAttributes(scope, id, { imageRecipeArn });
134
+ }
135
+ /**
136
+ * Import the latest version of an existing image recipe given its name. The provided name must be normalized by
137
+ * converting all alphabetical characters to lowercase, and replacing all spaces and underscores with hyphens.
138
+ */
139
+ static fromImageRecipeName(scope, id, imageRecipeName) {
140
+ return this.fromImageRecipeAttributes(scope, id, { imageRecipeName });
141
+ }
142
+ /**
143
+ * Import an existing image recipe by providing its attributes. If the image recipe name is provided as an attribute,
144
+ * it must be normalized by converting all alphabetical characters to lowercase, and replacing all spaces and
145
+ * underscores with hyphens.
146
+ */
147
+ static fromImageRecipeAttributes(scope, id, attrs) {
148
+ try {
149
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ImageRecipeAttributes(attrs);
150
+ }
151
+ catch (error) {
152
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
153
+ Error.captureStackTrace(error, this.fromImageRecipeAttributes);
154
+ }
155
+ throw error;
156
+ }
157
+ if (!attrs.imageRecipeArn && !attrs.imageRecipeName) {
158
+ throw new cdk.ValidationError('either imageRecipeArn or imageRecipeName must be provided to import an image recipe', scope);
159
+ }
160
+ const imageRecipeArn = attrs.imageRecipeArn ??
161
+ cdk.Stack.of(scope).formatArn({
162
+ service: 'imagebuilder',
163
+ resource: 'image-recipe',
164
+ resourceName: `${attrs.imageRecipeName}/${attrs.imageRecipeVersion ?? LATEST_VERSION}`,
165
+ });
166
+ const [imageRecipeName, imageRecipeVersion] = (() => {
167
+ if (attrs.imageRecipeName) {
168
+ return [attrs.imageRecipeName, attrs.imageRecipeVersion ?? LATEST_VERSION];
169
+ }
170
+ const imageRecipeNameVersion = cdk.Stack.of(scope).splitArn(imageRecipeArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
171
+ const imageRecipeNameVersionSplit = cdk.Fn.split('/', imageRecipeNameVersion);
172
+ return [cdk.Fn.select(0, imageRecipeNameVersionSplit), cdk.Fn.select(1, imageRecipeNameVersionSplit)];
173
+ })();
174
+ class Import extends ImageRecipeBase {
175
+ imageRecipeArn = imageRecipeArn;
176
+ imageRecipeName = imageRecipeName;
177
+ imageRecipeVersion = imageRecipeVersion;
178
+ }
179
+ return new Import(scope, id);
180
+ }
181
+ /**
182
+ * Return whether the given object is an ImageRecipe.
183
+ */
184
+ static isImageRecipe(x) {
185
+ return x !== null && typeof x === 'object' && IMAGE_RECIPE_SYMBOL in x;
186
+ }
187
+ /**
188
+ * The ARN of the image recipe
189
+ */
190
+ imageRecipeArn = __runInitializers(this, _instanceExtraInitializers);
191
+ /**
192
+ * The name of the image recipe
193
+ */
194
+ imageRecipeName;
195
+ /**
196
+ * The version of the image recipe
197
+ */
198
+ imageRecipeVersion;
199
+ blockDevices = [];
200
+ constructor(scope, id, props) {
201
+ super(scope, id, {
202
+ physicalName: props.imageRecipeName ??
203
+ cdk.Lazy.string({
204
+ produce: () => cdk.Names.uniqueResourceName(this, {
205
+ maxLength: 128,
206
+ separator: '-',
207
+ allowedSpecialCharacters: '-',
208
+ }).toLowerCase(), // Enforce lowercase for the auto-generated fallback
209
+ }),
210
+ });
211
+ try {
212
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ImageRecipeProps(props);
213
+ }
214
+ catch (error) {
215
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
216
+ Error.captureStackTrace(error, ImageRecipe);
217
+ }
218
+ throw error;
219
+ }
220
+ // Enhanced CDK Analytics Telemetry
221
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
222
+ Object.defineProperty(this, IMAGE_RECIPE_SYMBOL, { value: true });
223
+ this.validateImageRecipeName();
224
+ this.addBlockDevice(...(props.blockDevices ?? []));
225
+ const components = props.components?.map((component) => ({
226
+ componentArn: component.component.componentArn,
227
+ ...(component.parameters && {
228
+ parameters: Object.entries(component.parameters).map(([name, param]) => ({
229
+ name,
230
+ value: param.value,
231
+ })),
232
+ }),
233
+ }));
234
+ const imageRecipeVersion = props.imageRecipeVersion ?? DEFAULT_RECIPE_VERSION;
235
+ const imageRecipe = new aws_imagebuilder_1.CfnImageRecipe(this, 'Resource', {
236
+ name: this.physicalName,
237
+ version: imageRecipeVersion,
238
+ description: props.description,
239
+ parentImage: props.baseImage.image,
240
+ blockDeviceMappings: cdk.Lazy.any({ produce: () => this.renderBlockDevices() }),
241
+ workingDirectory: props.workingDirectory,
242
+ additionalInstanceConfiguration: this.buildAdditionalInstanceConfiguration(props),
243
+ amiTags: props.amiTags,
244
+ tags: props.tags,
245
+ ...(components?.length && { components }),
246
+ });
247
+ this.imageRecipeName = this.getResourceNameAttribute(imageRecipe.attrName);
248
+ this.imageRecipeArn = this.getResourceArnAttribute(imageRecipe.attrArn, {
249
+ service: 'imagebuilder',
250
+ resource: 'image-recipe',
251
+ resourceName: `${this.physicalName}/${imageRecipeVersion}`,
252
+ });
253
+ this.imageRecipeVersion = imageRecipe.getAtt('Version').toString();
254
+ }
255
+ /**
256
+ * Adds block devices to attach to the instance used for building the image.
257
+ *
258
+ * @param blockDevices The list of block devices to attach
259
+ */
260
+ addBlockDevice(...blockDevices) {
261
+ this.blockDevices.push(...blockDevices);
262
+ }
263
+ /**
264
+ * Renders the input block devices, into the `BlockDeviceMapping[]` structure that CfnImageRecipe expects to receive.
265
+ * This is rendered at synthesis time, as users can add additional block devices with `addBlockDevice`, after the
266
+ * construct has been instantiated.
267
+ *
268
+ * @private
269
+ */
270
+ renderBlockDevices() {
271
+ const blockDevices = this.blockDevices.map((blockDevice) => {
272
+ const ebsDevice = blockDevice.volume.ebsDevice;
273
+ const ebs = {
274
+ ...(ebsDevice?.deleteOnTermination !== undefined && { deleteOnTermination: ebsDevice.deleteOnTermination }),
275
+ ...(ebsDevice?.encrypted !== undefined && { encrypted: ebsDevice.encrypted }),
276
+ ...(ebsDevice?.iops !== undefined && { iops: ebsDevice.iops }),
277
+ ...(ebsDevice?.kmsKey !== undefined && { kmsKeyId: ebsDevice.kmsKey.keyArn }),
278
+ ...(ebsDevice?.snapshotId !== undefined && { snapshotId: ebsDevice.snapshotId }),
279
+ ...(ebsDevice?.throughput !== undefined && { throughput: ebsDevice.throughput }),
280
+ ...(ebsDevice?.volumeSize !== undefined && { volumeSize: ebsDevice.volumeSize }),
281
+ ...(ebsDevice?.volumeType !== undefined && { volumeType: ebsDevice.volumeType }),
282
+ };
283
+ return {
284
+ deviceName: blockDevice.deviceName,
285
+ virtualName: blockDevice.volume.virtualName,
286
+ ...(blockDevice.mappingEnabled === false && { noDevice: '' }),
287
+ ...(Object.keys(ebs).length && { ebs }),
288
+ };
289
+ });
290
+ return blockDevices.length ? blockDevices : undefined;
291
+ }
292
+ /**
293
+ * Generates the additional instance configuration property into the `AdditionalInstanceConfiguration` type in the
294
+ * CloudFormation L1 definition.
295
+ *
296
+ * @param props The props passed as input to the construct
297
+ * @private
298
+ */
299
+ buildAdditionalInstanceConfiguration(props) {
300
+ const systemsManagerAgent = {
301
+ ...(props.uninstallSsmAgentAfterBuild !== undefined && {
302
+ uninstallAfterBuild: props.uninstallSsmAgentAfterBuild,
303
+ }),
304
+ };
305
+ const additionalInstanceConfiguration = {
306
+ ...(Object.keys(systemsManagerAgent).length && { systemsManagerAgent }),
307
+ ...(props.userDataOverride !== undefined && { userDataOverride: cdk.Fn.base64(props.userDataOverride.render()) }),
308
+ };
309
+ return Object.keys(additionalInstanceConfiguration).length ? additionalInstanceConfiguration : undefined;
310
+ }
311
+ validateImageRecipeName() {
312
+ if (cdk.Token.isUnresolved(this.physicalName)) {
313
+ return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
314
+ }
315
+ if (this.physicalName.length > 128) {
316
+ throw new cdk.ValidationError(`the imageRecipeName cannot be longer than 128 characters, got: '${this.physicalName}'`, this);
317
+ }
318
+ if (this.physicalName.includes(' ')) {
319
+ throw new cdk.ValidationError(`the imageRecipeName cannot contain spaces, got: '${this.physicalName}'`, this);
320
+ }
321
+ if (this.physicalName.includes('_')) {
322
+ throw new cdk.ValidationError(`the imageRecipeName cannot contain underscores, got: '${this.physicalName}'`, this);
323
+ }
324
+ if (this.physicalName !== this.physicalName.toLowerCase()) {
325
+ throw new cdk.ValidationError(`the imageRecipeName must be lowercase, got: '${this.physicalName}'`, this);
326
+ }
327
+ }
328
+ static {
329
+ __runInitializers(_classThis, _classExtraInitializers);
330
+ }
331
+ };
332
+ return ImageRecipe = _classThis;
333
+ })();
334
+ exports.ImageRecipe = ImageRecipe;
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcmVjaXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW1hZ2UtcmVjaXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUFtQztBQUVuQywyQ0FBMkM7QUFDM0MsbUVBQThEO0FBQzlELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFNMUUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7QUFFdEY7Ozs7O0dBS0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQztBQTBJdkM7O0dBRUc7QUFDSCxNQUFlLGVBQWdCLFNBQVEsR0FBRyxDQUFDLFFBQVE7SUFnQmpEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLE9BQXVCLEVBQUUsR0FBRyxPQUFpQjtRQUN4RCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzlCLE9BQU87WUFDUCxPQUFPO1lBQ1AsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNuQyxLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxPQUF1QjtRQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLDZCQUE2QixDQUFDLENBQUM7S0FDM0Q7SUFFRDs7OztPQUlHO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNiO0NBQ0Y7QUFFRDs7OztHQUlHO0lBRVUsV0FBVzs0QkFEdkIsb0NBQWtCOzs7O3NCQUNjLGVBQWU7OzsyQkFBdkIsU0FBUSxXQUFlOzs7OzBDQXVKN0MsSUFBQSxrQ0FB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LEdBQUcsQ0FBQyxlQUFlLENBQUMsZ0RBQWdELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RyxDQUFDO1NBQ0Y7O1lBOU9VLHVEQUFXOzs7OztBQUFYLGtDQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbkltYWdlUmVjaXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWltYWdlYnVpbGRlcic7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlSW1hZ2UgfSBmcm9tICcuL2Jhc2UtaW1hZ2UnO1xuaW1wb3J0IHsgSUNvbnRhaW5lclJlY2lwZSB9IGZyb20gJy4vY29udGFpbmVyLXJlY2lwZSc7XG5pbXBvcnQgeyBDb21wb25lbnRDb25maWd1cmF0aW9uLCBJUmVjaXBlQmFzZSB9IGZyb20gJy4vcmVjaXBlLWJhc2UnO1xuXG5jb25zdCBJTUFHRV9SRUNJUEVfU1lNQk9MID0gU3ltYm9sLmZvcignQGF3cy1jZGsvYXdzLWltYWdlYnVpbGRlci1hbHBoYS5JbWFnZVJlY2lwZScpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGFuIGltYWdlIHJlY2lwZS4gV2hlbiB1c2luZyB0aGUgcmVjaXBlIGluIGEgcGlwZWxpbmUsIHRoZSBwaXBlbGluZSB3aWxsIHVzZSB0aGVcbiAqIGxhdGVzdCByZWNpcGUgYXQgdGhlIHRpbWUgb2YgZXhlY3V0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL2liaG93LXNlbWFudGljLXZlcnNpb25pbmcuaHRtbFxuICovXG5jb25zdCBMQVRFU1RfVkVSU0lPTiA9ICd4LngueCc7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgdmVyc2lvbiB0byB1c2UgaW4gdGhlIGltYWdlIHJlY2lwZS4gV2hlbiB0aGUgcmVjaXBlIGlzIHVwZGF0ZWQsIHRoZSBgeGAgd2lsbCBiZSBpbmNyZW1lbnRlZCBvZmYgZnJvbVxuICogdGhlIGxhdGVzdCByZWNpcGUgdmVyc2lvbiB0aGF0IGV4aXN0cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9jcmVhdGUtaW1hZ2UtcmVjaXBlcy5odG1sXG4gKi9cbmNvbnN0IERFRkFVTFRfUkVDSVBFX1ZFUlNJT04gPSAnMS4wLngnO1xuXG4vKipcbiAqIEFuIEVDMiBJbWFnZSBCdWlsZGVyIEltYWdlIFJlY2lwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW1hZ2VSZWNpcGUgZXh0ZW5kcyBJUmVjaXBlQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VSZWNpcGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbWFnZVJlY2lwZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpbWFnZVJlY2lwZVZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhbiBJbWFnZSBSZWNpcGUgcmVzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVJlY2lwZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltYWdlIGZvciBjdXN0b21pemF0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIGltYWdlIHJlY2lwZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VJbWFnZTogQmFzZUltYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UgcmVjaXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmFtZSBpcyBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlUmVjaXBlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGltYWdlIHJlY2lwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMS4wLnhcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlUmVjaXBlVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZSByZWNpcGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgdG8gYXBwbHkgaW4gdGhlIGltYWdlIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnRzPzogQ29tcG9uZW50Q29uZmlndXJhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgYWRkaXRpb25hbCB0YWdzIHRvIGFzc2lnbiB0byB0aGUgb3V0cHV0IEFNSSBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOb25lXG4gICAqL1xuICByZWFkb25seSBhbWlUYWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIGRldmljZXMgdG8gYXR0YWNoIHRvIHRoZSBpbnN0YW5jZSB1c2VkIGZvciBidWlsZGluZyB0aGUgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGJsb2NrRGV2aWNlcz86IGVjMi5CbG9ja0RldmljZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHVzZSBkdXJpbmcgYnVpbGQgYW5kIHRlc3Qgd29ya2Zsb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBJbWFnZSBCdWlsZGVyIGRlZmF1bHQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC4gRm9yIExpbnV4IGFuZCBtYWNPUyBidWlsZHMsIHRoaXMgd291bGQgYmUgL3RtcC4gRm9yXG4gICAqIFdpbmRvd3MgYnVpbGRzLCB0aGlzIHdvdWxkIGJlIEM6L1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byB1bmluc3RhbGwgdGhlIFN5c3RlbXMgTWFuYWdlciBhZ2VudCBmcm9tIHlvdXIgZmluYWwgYnVpbGQgaW1hZ2UsIHByaW9yIHRvIGNyZWF0aW5nIHRoZSBuZXcgQU1JLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoaXMgaXMgZmFsc2UgaWYgdGhlIFN5c3RlbXMgTWFuYWdlciBhZ2VudCBpcyBwcmUtaW5zdGFsbGVkIG9uIHRoZSBiYXNlIGltYWdlLiBPdGhlcndpc2UsIHRoaXMgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHVuaW5zdGFsbFNzbUFnZW50QWZ0ZXJCdWlsZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB1c2VyIGRhdGEgY29tbWFuZHMgdG8gcGFzcyB0byBJbWFnZSBCdWlsZGVyIGJ1aWxkIGFuZCB0ZXN0IEVDMiBpbnN0YW5jZXMuIEZvciBMaW51eCBhbmQgbWFjT1MsIEltYWdlIEJ1aWxkZXJcbiAgICogdXNlcyBhIGRlZmF1bHQgdXNlciBkYXRhIHNjcmlwdCB0byBpbnN0YWxsIHRoZSBTeXN0ZW1zIE1hbmFnZXIgYWdlbnQuIElmIHlvdSBvdmVycmlkZSB0aGUgdXNlciBkYXRhLCB5b3UgbXVzdFxuICAgKiBlbnN1cmUgdG8gYWRkIGNvbW1hbmRzIHRvIGluc3RhbGwgU3lzdGVtcyBNYW5hZ2VyIGFnZW50LCBpZiBpdCBpcyBub3QgcHJlLWluc3RhbGxlZCBvbiB5b3VyIGJhc2UgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJEYXRhT3ZlcnJpZGU/OiBlYzIuVXNlckRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIHRvIGFwcGx5IHRvIHRoZSBpbWFnZSByZWNpcGVcbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYW4gRUMyIEltYWdlIEJ1aWxkZXIgaW1hZ2UgcmVjaXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VSZWNpcGVBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlcml2ZWQgZnJvbSB0aGUgaW1hZ2VSZWNpcGVOYW1lXG4gICAqL1xuICByZWFkb25seSBpbWFnZVJlY2lwZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlcml2ZWQgZnJvbSB0aGUgaW1hZ2VSZWNpcGVBcm5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlUmVjaXBlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlcml2ZWQgZnJvbSBpbWFnZVJlY2lwZUFybi4gaWYgYSBpbWFnZVJlY2lwZU5hbWUgaXMgcHJvdmlkZWQsIHRoZSBsYXRlc3QgdmVyc2lvbiwgeC54LngsIHdpbGxcbiAgICogYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VSZWNpcGVWZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbmV3IG9yIGltcG9ydGVkIEltYWdlIFJlY2lwZVxuICovXG5hYnN0cmFjdCBjbGFzcyBJbWFnZVJlY2lwZUJhc2UgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJSW1hZ2VSZWNpcGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgaW1hZ2UgcmVjaXBlXG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBpbWFnZVJlY2lwZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UgcmVjaXBlXG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBpbWFnZVJlY2lwZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaW1hZ2VSZWNpcGVWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgaW1hZ2UgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuaW1hZ2VSZWNpcGVBcm5dLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyB0byB0aGUgZ2l2ZW4gZ3JhbnRlZSBmb3IgdGhlIGltYWdlIHJlY2lwZVxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChncmFudGVlLCAnaW1hZ2VidWlsZGVyOkdldEltYWdlUmVjaXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlY2lwZSBpcyBhIENvbnRhaW5lciBSZWNpcGVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzQ29udGFpbmVyUmVjaXBlKCk6IHRoaXMgaXMgSUNvbnRhaW5lclJlY2lwZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSByZWNpcGUgaXMgYW4gSW1hZ2UgUmVjaXBlXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9pc0ltYWdlUmVjaXBlKCk6IHRoaXMgaXMgSUltYWdlUmVjaXBlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgSW1hZ2UgUmVjaXBlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL21hbmFnZS1yZWNpcGVzLmh0bWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEltYWdlUmVjaXBlIGV4dGVuZHMgSW1hZ2VSZWNpcGVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaW1hZ2VidWlsZGVyLWFscGhhLkltYWdlUmVjaXBlJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGltYWdlIHJlY2lwZSBnaXZlbiBpdHMgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW1hZ2VSZWNpcGVBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgaW1hZ2VSZWNpcGVBcm46IHN0cmluZyk6IElJbWFnZVJlY2lwZSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUltYWdlUmVjaXBlQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgaW1hZ2VSZWNpcGVBcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhbiBleGlzdGluZyBpbWFnZSByZWNpcGUgZ2l2ZW4gaXRzIG5hbWUuIFRoZSBwcm92aWRlZCBuYW1lIG11c3QgYmUgbm9ybWFsaXplZCBieVxuICAgKiBjb252ZXJ0aW5nIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW1hZ2VSZWNpcGVOYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGltYWdlUmVjaXBlTmFtZTogc3RyaW5nKTogSUltYWdlUmVjaXBlIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tSW1hZ2VSZWNpcGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBpbWFnZVJlY2lwZU5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGltYWdlIHJlY2lwZSBieSBwcm92aWRpbmcgaXRzIGF0dHJpYnV0ZXMuIElmIHRoZSBpbWFnZSByZWNpcGUgbmFtZSBpcyBwcm92aWRlZCBhcyBhbiBhdHRyaWJ1dGUsXG4gICAqIGl0IG11c3QgYmUgbm9ybWFsaXplZCBieSBjb252ZXJ0aW5nIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcyBhbmRcbiAgICogdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW1hZ2VSZWNpcGVBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBJbWFnZVJlY2lwZUF0dHJpYnV0ZXMpOiBJSW1hZ2VSZWNpcGUge1xuICAgIGlmICghYXR0cnMuaW1hZ2VSZWNpcGVBcm4gJiYgIWF0dHJzLmltYWdlUmVjaXBlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdlaXRoZXIgaW1hZ2VSZWNpcGVBcm4gb3IgaW1hZ2VSZWNpcGVOYW1lIG11c3QgYmUgcHJvdmlkZWQgdG8gaW1wb3J0IGFuIGltYWdlIHJlY2lwZScsXG4gICAgICAgIHNjb3BlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWFnZVJlY2lwZUFybiA9XG4gICAgICBhdHRycy5pbWFnZVJlY2lwZUFybiA/P1xuICAgICAgY2RrLlN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgICAgcmVzb3VyY2U6ICdpbWFnZS1yZWNpcGUnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGAke2F0dHJzLmltYWdlUmVjaXBlTmFtZX0vJHthdHRycy5pbWFnZVJlY2lwZVZlcnNpb24gPz8gTEFURVNUX1ZFUlNJT059YCxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgW2ltYWdlUmVjaXBlTmFtZSwgaW1hZ2VSZWNpcGVWZXJzaW9uXSA9ICgoKSA9PiB7XG4gICAgICBpZiAoYXR0cnMuaW1hZ2VSZWNpcGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBbYXR0cnMuaW1hZ2VSZWNpcGVOYW1lLCBhdHRycy5pbWFnZVJlY2lwZVZlcnNpb24gPz8gTEFURVNUX1ZFUlNJT05dO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbWFnZVJlY2lwZU5hbWVWZXJzaW9uID0gY2RrLlN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihcbiAgICAgICAgaW1hZ2VSZWNpcGVBcm4sXG4gICAgICAgIGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICkucmVzb3VyY2VOYW1lITtcblxuICAgICAgY29uc3QgaW1hZ2VSZWNpcGVOYW1lVmVyc2lvblNwbGl0ID0gY2RrLkZuLnNwbGl0KCcvJywgaW1hZ2VSZWNpcGVOYW1lVmVyc2lvbik7XG4gICAgICByZXR1cm4gW2Nkay5Gbi5zZWxlY3QoMCwgaW1hZ2VSZWNpcGVOYW1lVmVyc2lvblNwbGl0KSwgY2RrLkZuLnNlbGVjdCgxLCBpbWFnZVJlY2lwZU5hbWVWZXJzaW9uU3BsaXQpXTtcbiAgICB9KSgpO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgSW1hZ2VSZWNpcGVCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpbWFnZVJlY2lwZUFybiA9IGltYWdlUmVjaXBlQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGltYWdlUmVjaXBlTmFtZSA9IGltYWdlUmVjaXBlTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpbWFnZVJlY2lwZVZlcnNpb24gPSBpbWFnZVJlY2lwZVZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFuIEltYWdlUmVjaXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0ltYWdlUmVjaXBlKHg6IGFueSk6IHggaXMgSW1hZ2VSZWNpcGUge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiBJTUFHRV9SRUNJUEVfU1lNQk9MIGluIHg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgaW1hZ2UgcmVjaXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW1hZ2VSZWNpcGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGltYWdlIHJlY2lwZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlUmVjaXBlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgaW1hZ2UgcmVjaXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW1hZ2VSZWNpcGVWZXJzaW9uOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja0RldmljZXM6IGVjMi5CbG9ja0RldmljZVtdID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbWFnZVJlY2lwZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6XG4gICAgICAgIHByb3BzLmltYWdlUmVjaXBlTmFtZSA/P1xuICAgICAgICBjZGsuTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+XG4gICAgICAgICAgICBjZGsuTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgICAgICAgbWF4TGVuZ3RoOiAxMjgsXG4gICAgICAgICAgICAgIHNlcGFyYXRvcjogJy0nLFxuICAgICAgICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctJyxcbiAgICAgICAgICAgIH0pLnRvTG93ZXJDYXNlKCksIC8vIEVuZm9yY2UgbG93ZXJjYXNlIGZvciB0aGUgYXV0by1nZW5lcmF0ZWQgZmFsbGJhY2tcbiAgICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgSU1BR0VfUkVDSVBFX1NZTUJPTCwgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMudmFsaWRhdGVJbWFnZVJlY2lwZU5hbWUoKTtcblxuICAgIHRoaXMuYWRkQmxvY2tEZXZpY2UoLi4uKHByb3BzLmJsb2NrRGV2aWNlcyA/PyBbXSkpO1xuXG4gICAgY29uc3QgY29tcG9uZW50czogQ2ZuSW1hZ2VSZWNpcGUuQ29tcG9uZW50Q29uZmlndXJhdGlvblByb3BlcnR5W10gfCB1bmRlZmluZWQgPSBwcm9wcy5jb21wb25lbnRzPy5tYXAoXG4gICAgICAoY29tcG9uZW50KSA9PiAoe1xuICAgICAgICBjb21wb25lbnRBcm46IGNvbXBvbmVudC5jb21wb25lbnQuY29tcG9uZW50QXJuLFxuICAgICAgICAuLi4oY29tcG9uZW50LnBhcmFtZXRlcnMgJiYge1xuICAgICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudC5wYXJhbWV0ZXJzKS5tYXAoXG4gICAgICAgICAgICAoW25hbWUsIHBhcmFtXSk6IENmbkltYWdlUmVjaXBlLkNvbXBvbmVudFBhcmFtZXRlclByb3BlcnR5ID0+ICh7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiBwYXJhbS52YWx1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGltYWdlUmVjaXBlVmVyc2lvbiA9IHByb3BzLmltYWdlUmVjaXBlVmVyc2lvbiA/PyBERUZBVUxUX1JFQ0lQRV9WRVJTSU9OO1xuICAgIGNvbnN0IGltYWdlUmVjaXBlID0gbmV3IENmbkltYWdlUmVjaXBlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgdmVyc2lvbjogaW1hZ2VSZWNpcGVWZXJzaW9uLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50SW1hZ2U6IHByb3BzLmJhc2VJbWFnZS5pbWFnZSxcbiAgICAgIGJsb2NrRGV2aWNlTWFwcGluZ3M6IGNkay5MYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMucmVuZGVyQmxvY2tEZXZpY2VzKCkgfSksXG4gICAgICB3b3JraW5nRGlyZWN0b3J5OiBwcm9wcy53b3JraW5nRGlyZWN0b3J5LFxuICAgICAgYWRkaXRpb25hbEluc3RhbmNlQ29uZmlndXJhdGlvbjogdGhpcy5idWlsZEFkZGl0aW9uYWxJbnN0YW5jZUNvbmZpZ3VyYXRpb24ocHJvcHMpLFxuICAgICAgYW1pVGFnczogcHJvcHMuYW1pVGFncyxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICAuLi4oY29tcG9uZW50cz8ubGVuZ3RoICYmIHsgY29tcG9uZW50cyB9KSxcbiAgICB9KTtcblxuICAgIHRoaXMuaW1hZ2VSZWNpcGVOYW1lID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUoaW1hZ2VSZWNpcGUuYXR0ck5hbWUpO1xuICAgIHRoaXMuaW1hZ2VSZWNpcGVBcm4gPSB0aGlzLmdldFJlc291cmNlQXJuQXR0cmlidXRlKGltYWdlUmVjaXBlLmF0dHJBcm4sIHtcbiAgICAgIHNlcnZpY2U6ICdpbWFnZWJ1aWxkZXInLFxuICAgICAgcmVzb3VyY2U6ICdpbWFnZS1yZWNpcGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLnBoeXNpY2FsTmFtZX0vJHtpbWFnZVJlY2lwZVZlcnNpb259YCxcbiAgICB9KTtcbiAgICB0aGlzLmltYWdlUmVjaXBlVmVyc2lvbiA9IGltYWdlUmVjaXBlLmdldEF0dCgnVmVyc2lvbicpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBibG9jayBkZXZpY2VzIHRvIGF0dGFjaCB0byB0aGUgaW5zdGFuY2UgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIGltYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gYmxvY2tEZXZpY2VzIFRoZSBsaXN0IG9mIGJsb2NrIGRldmljZXMgdG8gYXR0YWNoXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkQmxvY2tEZXZpY2UoLi4uYmxvY2tEZXZpY2VzOiBlYzIuQmxvY2tEZXZpY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuYmxvY2tEZXZpY2VzLnB1c2goLi4uYmxvY2tEZXZpY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBpbnB1dCBibG9jayBkZXZpY2VzLCBpbnRvIHRoZSBgQmxvY2tEZXZpY2VNYXBwaW5nW11gIHN0cnVjdHVyZSB0aGF0IENmbkltYWdlUmVjaXBlIGV4cGVjdHMgdG8gcmVjZWl2ZS5cbiAgICogVGhpcyBpcyByZW5kZXJlZCBhdCBzeW50aGVzaXMgdGltZSwgYXMgdXNlcnMgY2FuIGFkZCBhZGRpdGlvbmFsIGJsb2NrIGRldmljZXMgd2l0aCBgYWRkQmxvY2tEZXZpY2VgLCBhZnRlciB0aGVcbiAgICogY29uc3RydWN0IGhhcyBiZWVuIGluc3RhbnRpYXRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tEZXZpY2VzKCk6IENmbkltYWdlUmVjaXBlLkluc3RhbmNlQmxvY2tEZXZpY2VNYXBwaW5nUHJvcGVydHlbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYmxvY2tEZXZpY2VzID0gdGhpcy5ibG9ja0RldmljZXMubWFwKChibG9ja0RldmljZSk6IENmbkltYWdlUmVjaXBlLkluc3RhbmNlQmxvY2tEZXZpY2VNYXBwaW5nUHJvcGVydHkgPT4ge1xuICAgICAgY29uc3QgZWJzRGV2aWNlID0gYmxvY2tEZXZpY2Uudm9sdW1lLmVic0RldmljZTtcbiAgICAgIGNvbnN0IGViczogQ2ZuSW1hZ2VSZWNpcGUuRWJzSW5zdGFuY2VCbG9ja0RldmljZVNwZWNpZmljYXRpb25Qcm9wZXJ0eSA9IHtcbiAgICAgICAgLi4uKGVic0RldmljZT8uZGVsZXRlT25UZXJtaW5hdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgZGVsZXRlT25UZXJtaW5hdGlvbjogZWJzRGV2aWNlLmRlbGV0ZU9uVGVybWluYXRpb24gfSksXG4gICAgICAgIC4uLihlYnNEZXZpY2U/LmVuY3J5cHRlZCAhPT0gdW5kZWZpbmVkICYmIHsgZW5jcnlwdGVkOiBlYnNEZXZpY2UuZW5jcnlwdGVkIH0pLFxuICAgICAgICAuLi4oZWJzRGV2aWNlPy5pb3BzICE9PSB1bmRlZmluZWQgJiYgeyBpb3BzOiBlYnNEZXZpY2UuaW9wcyB9KSxcbiAgICAgICAgLi4uKGVic0RldmljZT8ua21zS2V5ICE9PSB1bmRlZmluZWQgJiYgeyBrbXNLZXlJZDogZWJzRGV2aWNlLmttc0tleS5rZXlBcm4gfSksXG4gICAgICAgIC4uLihlYnNEZXZpY2U/LnNuYXBzaG90SWQgIT09IHVuZGVmaW5lZCAmJiB7IHNuYXBzaG90SWQ6IGVic0RldmljZS5zbmFwc2hvdElkIH0pLFxuICAgICAgICAuLi4oZWJzRGV2aWNlPy50aHJvdWdocHV0ICE9PSB1bmRlZmluZWQgJiYgeyB0aHJvdWdocHV0OiBlYnNEZXZpY2UudGhyb3VnaHB1dCB9KSxcbiAgICAgICAgLi4uKGVic0RldmljZT8udm9sdW1lU2l6ZSAhPT0gdW5kZWZpbmVkICYmIHsgdm9sdW1lU2l6ZTogZWJzRGV2aWNlLnZvbHVtZVNpemUgfSksXG4gICAgICAgIC4uLihlYnNEZXZpY2U/LnZvbHVtZVR5cGUgIT09IHVuZGVmaW5lZCAmJiB7IHZvbHVtZVR5cGU6IGVic0RldmljZS52b2x1bWVUeXBlIH0pLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGV2aWNlTmFtZTogYmxvY2tEZXZpY2UuZGV2aWNlTmFtZSxcbiAgICAgICAgdmlydHVhbE5hbWU6IGJsb2NrRGV2aWNlLnZvbHVtZS52aXJ0dWFsTmFtZSxcbiAgICAgICAgLi4uKGJsb2NrRGV2aWNlLm1hcHBpbmdFbmFibGVkID09PSBmYWxzZSAmJiB7IG5vRGV2aWNlOiAnJyB9KSxcbiAgICAgICAgLi4uKE9iamVjdC5rZXlzKGVicykubGVuZ3RoICYmIHsgZWJzIH0pLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBibG9ja0RldmljZXMubGVuZ3RoID8gYmxvY2tEZXZpY2VzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgYWRkaXRpb25hbCBpbnN0YW5jZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGludG8gdGhlIGBBZGRpdGlvbmFsSW5zdGFuY2VDb25maWd1cmF0aW9uYCB0eXBlIGluIHRoZVxuICAgKiBDbG91ZEZvcm1hdGlvbiBMMSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQWRkaXRpb25hbEluc3RhbmNlQ29uZmlndXJhdGlvbihcbiAgICBwcm9wczogSW1hZ2VSZWNpcGVQcm9wcyxcbiAgKTogQ2ZuSW1hZ2VSZWNpcGUuQWRkaXRpb25hbEluc3RhbmNlQ29uZmlndXJhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzeXN0ZW1zTWFuYWdlckFnZW50OiBDZm5JbWFnZVJlY2lwZS5TeXN0ZW1zTWFuYWdlckFnZW50UHJvcGVydHkgPSB7XG4gICAgICAuLi4ocHJvcHMudW5pbnN0YWxsU3NtQWdlbnRBZnRlckJ1aWxkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICB1bmluc3RhbGxBZnRlckJ1aWxkOiBwcm9wcy51bmluc3RhbGxTc21BZ2VudEFmdGVyQnVpbGQsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWRkaXRpb25hbEluc3RhbmNlQ29uZmlndXJhdGlvbjogQ2ZuSW1hZ2VSZWNpcGUuQWRkaXRpb25hbEluc3RhbmNlQ29uZmlndXJhdGlvblByb3BlcnR5ID0ge1xuICAgICAgLi4uKE9iamVjdC5rZXlzKHN5c3RlbXNNYW5hZ2VyQWdlbnQpLmxlbmd0aCAmJiB7IHN5c3RlbXNNYW5hZ2VyQWdlbnQgfSksXG4gICAgICAuLi4ocHJvcHMudXNlckRhdGFPdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmIHsgdXNlckRhdGFPdmVycmlkZTogY2RrLkZuLmJhc2U2NChwcm9wcy51c2VyRGF0YU92ZXJyaWRlLnJlbmRlcigpKSB9KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGFkZGl0aW9uYWxJbnN0YW5jZUNvbmZpZ3VyYXRpb24pLmxlbmd0aCA/IGFkZGl0aW9uYWxJbnN0YW5jZUNvbmZpZ3VyYXRpb24gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlSW1hZ2VSZWNpcGVOYW1lKCkge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucGh5c2ljYWxOYW1lKSkge1xuICAgICAgcmV0dXJuOyAvLyBDYW5ub3QgdmFsaWRhdGUgdW5yZXNvbHZlZCB0b2tlbnMsIGdpdmVuIHRoZWlyIGFjdHVhbCB2YWx1ZSBpcyByZW5kZXJlZCBhdCBkZXBsb3ltZW50IHRpbWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUubGVuZ3RoID4gMTI4KSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYHRoZSBpbWFnZVJlY2lwZU5hbWUgY2Fubm90IGJlIGxvbmdlciB0aGFuIDEyOCBjaGFyYWN0ZXJzLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJyAnKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoYHRoZSBpbWFnZVJlY2lwZU5hbWUgY2Fubm90IGNvbnRhaW4gc3BhY2VzLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGB0aGUgaW1hZ2VSZWNpcGVOYW1lIGNhbm5vdCBjb250YWluIHVuZGVyc2NvcmVzLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgaW1hZ2VSZWNpcGVOYW1lIG11c3QgYmUgbG93ZXJjYXNlLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -1,4 +1,9 @@
1
1
  export * from './component';
2
+ export * from './container-recipe';
2
3
  export * from './distribution-configuration';
4
+ export * from './image-recipe';
3
5
  export * from './infrastructure-configuration';
6
+ export * from './workflow';
7
+ export * from './base-image';
4
8
  export * from './os-version';
9
+ export * from './recipe-base';
package/lib/index.js CHANGED
@@ -16,7 +16,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  };
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  __exportStar(require("./component"), exports);
19
+ __exportStar(require("./container-recipe"), exports);
19
20
  __exportStar(require("./distribution-configuration"), exports);
21
+ __exportStar(require("./image-recipe"), exports);
20
22
  __exportStar(require("./infrastructure-configuration"), exports);
23
+ __exportStar(require("./workflow"), exports);
24
+ __exportStar(require("./base-image"), exports);
21
25
  __exportStar(require("./os-version"), exports);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOENBQThDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRTlDLDhDQUE0QjtBQUM1QiwrREFBNkM7QUFDN0MsaUVBQStDO0FBRS9DLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFXUzo6SW1hZ2VCdWlsZGVyIENsb3VkRm9ybWF0aW9uIFJlc291cmNlczpcblxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXN0cmlidXRpb24tY29uZmlndXJhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2luZnJhc3RydWN0dXJlLWNvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgKiBmcm9tICcuL29zLXZlcnNpb24nO1xuIl19
26
+ __exportStar(require("./recipe-base"), exports);
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOENBQThDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRTlDLDhDQUE0QjtBQUM1QixxREFBbUM7QUFDbkMsK0RBQTZDO0FBQzdDLGlEQUErQjtBQUMvQixpRUFBK0M7QUFDL0MsNkNBQTJCO0FBRTNCLCtDQUE2QjtBQUM3QiwrQ0FBNkI7QUFDN0IsZ0RBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVdTOjpJbWFnZUJ1aWxkZXIgQ2xvdWRGb3JtYXRpb24gUmVzb3VyY2VzOlxuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRhaW5lci1yZWNpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXN0cmlidXRpb24tY29uZmlndXJhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlLXJlY2lwZSc7XG5leHBvcnQgKiBmcm9tICcuL2luZnJhc3RydWN0dXJlLWNvbmZpZ3VyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vYmFzZS1pbWFnZSc7XG5leHBvcnQgKiBmcm9tICcuL29zLXZlcnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZWNpcGUtYmFzZSc7XG4iXX0=
@@ -125,7 +125,7 @@ let InfrastructureConfiguration = (() => {
125
125
  InfrastructureConfiguration = _classThis = _classDescriptor.value;
126
126
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
127
127
  }
128
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.InfrastructureConfiguration", version: "2.228.0-alpha.0" };
128
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.InfrastructureConfiguration", version: "2.229.1-alpha.0" };
129
129
  /** Uniquely identifies this class. */
130
130
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.InfrastructureConfiguration';
131
131
  /**
package/lib/os-version.js CHANGED
@@ -25,7 +25,7 @@ var Platform;
25
25
  * Represents an OS version for an EC2 Image Builder image
26
26
  */
27
27
  class OSVersion {
28
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.OSVersion", version: "2.228.0-alpha.0" };
28
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.OSVersion", version: "2.229.1-alpha.0" };
29
29
  /**
30
30
  * OS version for all Linux images
31
31
  */
@@ -0,0 +1,69 @@
1
+ import * as cdk from 'aws-cdk-lib';
2
+ import * as iam from 'aws-cdk-lib/aws-iam';
3
+ import { IComponent } from './component';
4
+ import { IContainerRecipe } from './container-recipe';
5
+ import { IImageRecipe } from './image-recipe';
6
+ /**
7
+ * The parameter value for a component parameter
8
+ */
9
+ export declare class ComponentParameterValue {
10
+ /**
11
+ * The value of the parameter as a string
12
+ *
13
+ * @param value The string value of the parameter
14
+ */
15
+ static fromString(value: string): ComponentParameterValue;
16
+ /**
17
+ * The rendered parameter value
18
+ */
19
+ readonly value: string[];
20
+ protected constructor(value: string[]);
21
+ }
22
+ /**
23
+ * Configuration details for a component, to include in a recipe
24
+ */
25
+ export interface ComponentConfiguration {
26
+ /**
27
+ * The component to execute as part of the image build
28
+ */
29
+ readonly component: IComponent;
30
+ /**
31
+ * The parameters to use when executing the component
32
+ *
33
+ * @default - no parameters. if the component contains parameters, their default values will be used. otherwise, any
34
+ * required parameters that are not included will result in a build failure
35
+ */
36
+ readonly parameters?: {
37
+ [name: string]: ComponentParameterValue;
38
+ };
39
+ }
40
+ /**
41
+ * A base interface for EC2 Image Builder recipes
42
+ */
43
+ export interface IRecipeBase extends cdk.IResource {
44
+ /**
45
+ * Grant custom actions to the given grantee for the recipe
46
+ *
47
+ * @param grantee The principal
48
+ * @param actions The list of actions
49
+ */
50
+ grant(grantee: iam.IGrantable, ...actions: string[]): iam.Grant;
51
+ /**
52
+ * Grant read permissions to the given grantee for the recipe
53
+ *
54
+ * @param grantee The principal
55
+ */
56
+ grantRead(grantee: iam.IGrantable): iam.Grant;
57
+ /**
58
+ * Indicates whether the recipe is a Container Recipe
59
+ *
60
+ * @internal
61
+ */
62
+ _isContainerRecipe(): this is IContainerRecipe;
63
+ /**
64
+ * Indicates whether the recipe is an Image Recipe
65
+ *
66
+ * @internal
67
+ */
68
+ _isImageRecipe(): this is IImageRecipe;
69
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ComponentParameterValue = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ /**
6
+ * The parameter value for a component parameter
7
+ */
8
+ class ComponentParameterValue {
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ComponentParameterValue", version: "2.229.1-alpha.0" };
10
+ /**
11
+ * The value of the parameter as a string
12
+ *
13
+ * @param value The string value of the parameter
14
+ */
15
+ static fromString(value) {
16
+ return new ComponentParameterValue([value]);
17
+ }
18
+ /**
19
+ * The rendered parameter value
20
+ */
21
+ value;
22
+ constructor(value) {
23
+ this.value = value;
24
+ }
25
+ }
26
+ exports.ComponentParameterValue = ComponentParameterValue;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXBlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZWNpcGUtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBTUE7O0dBRUc7QUFDSCxNQUFhLHVCQUF1Qjs7SUFDbEM7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBYTtRQUNwQyxPQUFPLElBQUksdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQzdDO0lBRUQ7O09BRUc7SUFDYSxLQUFLLENBQVc7SUFFaEMsWUFBc0IsS0FBZTtRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztLQUNwQjs7QUFqQkgsMERBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBJQ29udGFpbmVyUmVjaXBlIH0gZnJvbSAnLi9jb250YWluZXItcmVjaXBlJztcbmltcG9ydCB7IElJbWFnZVJlY2lwZSB9IGZyb20gJy4vaW1hZ2UtcmVjaXBlJztcblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVyIHZhbHVlIGZvciBhIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhcmFtZXRlclZhbHVlIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGFzIGEgc3RyaW5nXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogQ29tcG9uZW50UGFyYW1ldGVyVmFsdWUge1xuICAgIHJldHVybiBuZXcgQ29tcG9uZW50UGFyYW1ldGVyVmFsdWUoW3ZhbHVlXSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIHBhcmFtZXRlciB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmdbXTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciBhIGNvbXBvbmVudCwgdG8gaW5jbHVkZSBpbiBhIHJlY2lwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB0byBleGVjdXRlIGFzIHBhcnQgb2YgdGhlIGltYWdlIGJ1aWxkXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IElDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGV4ZWN1dGluZyB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFyYW1ldGVycy4gaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyBwYXJhbWV0ZXJzLCB0aGVpciBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQuIG90aGVyd2lzZSwgYW55XG4gICAqICAgICAgICAgICAgcmVxdWlyZWQgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgd2lsbCByZXN1bHQgaW4gYSBidWlsZCBmYWlsdXJlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogQ29tcG9uZW50UGFyYW1ldGVyVmFsdWUgfTtcbn1cblxuLyoqXG4gKiBBIGJhc2UgaW50ZXJmYWNlIGZvciBFQzIgSW1hZ2UgQnVpbGRlciByZWNpcGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJlY2lwZUJhc2UgZXh0ZW5kcyBjZGsuSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlY2lwZSBpcyBhIENvbnRhaW5lciBSZWNpcGVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaXNDb250YWluZXJSZWNpcGUoKTogdGhpcyBpcyBJQ29udGFpbmVyUmVjaXBlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVjaXBlIGlzIGFuIEltYWdlIFJlY2lwZVxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9pc0ltYWdlUmVjaXBlKCk6IHRoaXMgaXMgSUltYWdlUmVjaXBlO1xufVxuIl19