cdk-assets 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +195 -0
- package/bin/cdk-assets +2 -0
- package/bin/cdk-assets.d.ts +1 -0
- package/bin/cdk-assets.js +70 -0
- package/bin/docker-credential-cdk-assets +2 -0
- package/bin/docker-credential-cdk-assets.d.ts +13 -0
- package/bin/docker-credential-cdk-assets.js +39 -0
- package/bin/list.d.ts +3 -0
- package/bin/list.js +10 -0
- package/bin/logging.d.ts +4 -0
- package/bin/logging.js +28 -0
- package/bin/publish.d.ts +5 -0
- package/bin/publish.js +49 -0
- package/lib/asset-manifest.d.ts +162 -0
- package/lib/asset-manifest.js +245 -0
- package/lib/aws-types.d.ts +1660 -0
- package/lib/aws-types.js +138 -0
- package/lib/aws.d.ts +70 -0
- package/lib/aws.js +125 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/private/archive.d.ts +3 -0
- package/lib/private/archive.js +87 -0
- package/lib/private/asset-handler.d.ts +54 -0
- package/lib/private/asset-handler.js +3 -0
- package/lib/private/docker-credentials.d.ts +35 -0
- package/lib/private/docker-credentials.js +89 -0
- package/lib/private/docker.d.ts +98 -0
- package/lib/private/docker.js +232 -0
- package/lib/private/fs-extra.d.ts +3 -0
- package/lib/private/fs-extra.js +37 -0
- package/lib/private/handlers/client-options.d.ts +3 -0
- package/lib/private/handlers/client-options.js +12 -0
- package/lib/private/handlers/container-images.d.ts +22 -0
- package/lib/private/handlers/container-images.js +224 -0
- package/lib/private/handlers/files.d.ts +14 -0
- package/lib/private/handlers/files.js +288 -0
- package/lib/private/handlers/index.d.ts +3 -0
- package/lib/private/handlers/index.js +16 -0
- package/lib/private/p-limit.d.ts +10 -0
- package/lib/private/p-limit.js +51 -0
- package/lib/private/placeholders.d.ts +10 -0
- package/lib/private/placeholders.js +34 -0
- package/lib/private/shell.d.ts +24 -0
- package/lib/private/shell.js +131 -0
- package/lib/private/util.d.ts +5 -0
- package/lib/private/util.js +16 -0
- package/lib/progress.d.ts +114 -0
- package/lib/progress.js +104 -0
- package/lib/publishing.d.ts +118 -0
- package/lib/publishing.js +193 -0
- package/package.json +103 -0
- package/scripts/manual-test-manifest.json +12 -0
- package/scripts/manual-test.sh +22 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileAssetHandler = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
|
|
7
|
+
const mime = require("mime");
|
|
8
|
+
const client_options_1 = require("./client-options");
|
|
9
|
+
const progress_1 = require("../../progress");
|
|
10
|
+
const archive_1 = require("../archive");
|
|
11
|
+
const fs_extra_1 = require("../fs-extra");
|
|
12
|
+
const placeholders_1 = require("../placeholders");
|
|
13
|
+
const shell_1 = require("../shell");
|
|
14
|
+
/**
|
|
15
|
+
* The size of an empty zip file is 22 bytes
|
|
16
|
+
*
|
|
17
|
+
* Ref: https://en.wikipedia.org/wiki/ZIP_(file_format)
|
|
18
|
+
*/
|
|
19
|
+
const EMPTY_ZIP_FILE_SIZE = 22;
|
|
20
|
+
class FileAssetHandler {
|
|
21
|
+
constructor(workDir, asset, host) {
|
|
22
|
+
this.workDir = workDir;
|
|
23
|
+
this.asset = asset;
|
|
24
|
+
this.host = host;
|
|
25
|
+
this.fileCacheRoot = path.join(workDir, '.cache');
|
|
26
|
+
}
|
|
27
|
+
async build() { }
|
|
28
|
+
async isPublished() {
|
|
29
|
+
const destination = await (0, placeholders_1.replaceAwsPlaceholders)(this.asset.destination, this.host.aws);
|
|
30
|
+
const s3Url = `s3://${destination.bucketName}/${destination.objectKey}`;
|
|
31
|
+
try {
|
|
32
|
+
const s3 = await this.host.aws.s3Client({
|
|
33
|
+
...(0, client_options_1.destinationToClientOptions)(destination),
|
|
34
|
+
quiet: true,
|
|
35
|
+
});
|
|
36
|
+
this.host.emitMessage(progress_1.EventType.CHECK, `Check ${s3Url}`);
|
|
37
|
+
if (await objectExists(s3, destination.bucketName, destination.objectKey)) {
|
|
38
|
+
this.host.emitMessage(progress_1.EventType.FOUND, `Found ${s3Url}`);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
this.host.emitMessage(progress_1.EventType.DEBUG, `${e.message}`);
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
async publish(options = {}) {
|
|
48
|
+
const destination = await (0, placeholders_1.replaceAwsPlaceholders)(this.asset.destination, this.host.aws);
|
|
49
|
+
const s3Url = `s3://${destination.bucketName}/${destination.objectKey}`;
|
|
50
|
+
const clientOptions = (0, client_options_1.destinationToClientOptions)(destination);
|
|
51
|
+
const s3 = await this.host.aws.s3Client(clientOptions);
|
|
52
|
+
this.host.emitMessage(progress_1.EventType.CHECK, `Check ${s3Url}`);
|
|
53
|
+
const bucketInfo = BucketInformation.for(this.host);
|
|
54
|
+
// A thunk for describing the current account. Used when we need to format an error
|
|
55
|
+
// message, not in the success case.
|
|
56
|
+
const account = async () => (await this.host.aws.discoverTargetAccount(clientOptions)).accountId;
|
|
57
|
+
const allowCrossAccount = options.allowCrossAccount ?? true;
|
|
58
|
+
switch (await bucketInfo.bucketOwnership(s3, destination.bucketName, allowCrossAccount ? undefined : await account())) {
|
|
59
|
+
case BucketOwnership.MINE:
|
|
60
|
+
break;
|
|
61
|
+
case BucketOwnership.DOES_NOT_EXIST:
|
|
62
|
+
throw new Error(`No bucket named '${destination.bucketName}'. Is account ${await account()} bootstrapped?`);
|
|
63
|
+
case BucketOwnership.NO_ACCESS:
|
|
64
|
+
throw new Error(`Bucket named '${destination.bucketName}' exists, but we dont have access to it.`);
|
|
65
|
+
case BucketOwnership.SOMEONE_ELSES_AND_HAVE_ACCESS:
|
|
66
|
+
if (!allowCrossAccount) {
|
|
67
|
+
throw new Error(`❗❗ UNEXPECTED BUCKET OWNER DETECTED ❗❗
|
|
68
|
+
|
|
69
|
+
We've detected that the S3 bucket ${destination.bucketName} was
|
|
70
|
+
originally created in account ${await account()} as part of the CloudFormation stack CDKToolkit,
|
|
71
|
+
but now resides in a different AWS account. To prevent cross-account asset bucket access of your
|
|
72
|
+
deployments, CDK will stop now.
|
|
73
|
+
|
|
74
|
+
If this situation is intentional and you own the AWS account that the bucket has moved to, remove the
|
|
75
|
+
resource named StagingBucket from the template of CloudFormation stack CDKToolkit and try again.
|
|
76
|
+
|
|
77
|
+
If this situation is not intentional, we strongly recommend auditing your account to make sure all
|
|
78
|
+
resources are configured the way you expect them [1]. For questions or concerns, please contact
|
|
79
|
+
AWS Support [2].
|
|
80
|
+
|
|
81
|
+
[1] https://repost.aws/knowledge-center/potential-account-compromise
|
|
82
|
+
|
|
83
|
+
[2] https://aws.amazon.com/support`);
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
if (await objectExists(s3, destination.bucketName, destination.objectKey)) {
|
|
88
|
+
this.host.emitMessage(progress_1.EventType.FOUND, `Found ${s3Url}`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Identify the the bucket encryption type to set the header on upload
|
|
92
|
+
// required for SCP rules denying uploads without encryption header
|
|
93
|
+
let paramsEncryption = {};
|
|
94
|
+
const encryption2 = await bucketInfo.bucketEncryption(s3, destination.bucketName);
|
|
95
|
+
switch (encryption2.type) {
|
|
96
|
+
case 'no_encryption':
|
|
97
|
+
break;
|
|
98
|
+
case 'aes256':
|
|
99
|
+
paramsEncryption = { ServerSideEncryption: 'AES256' };
|
|
100
|
+
break;
|
|
101
|
+
case 'kms':
|
|
102
|
+
// We must include the key ID otherwise S3 will encrypt with the default key
|
|
103
|
+
paramsEncryption = {
|
|
104
|
+
ServerSideEncryption: 'aws:kms',
|
|
105
|
+
SSEKMSKeyId: encryption2.kmsKeyId,
|
|
106
|
+
};
|
|
107
|
+
break;
|
|
108
|
+
case 'does_not_exist':
|
|
109
|
+
this.host.emitMessage(progress_1.EventType.DEBUG, `No bucket named '${destination.bucketName}'. Is account ${await account()} bootstrapped?`);
|
|
110
|
+
break;
|
|
111
|
+
case 'access_denied':
|
|
112
|
+
this.host.emitMessage(progress_1.EventType.DEBUG, `Could not read encryption settings of bucket '${destination.bucketName}': uploading with default settings ("cdk bootstrap" to version 9 if your organization's policies prevent a successful upload or to get rid of this message).`);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (this.host.aborted) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const publishFile = this.asset.source.executable
|
|
119
|
+
? await this.externalPackageFile(this.asset.source.executable)
|
|
120
|
+
: await this.packageFile(this.asset.source);
|
|
121
|
+
this.host.emitMessage(progress_1.EventType.UPLOAD, `Upload ${s3Url}`);
|
|
122
|
+
const params = Object.assign({}, {
|
|
123
|
+
Bucket: destination.bucketName,
|
|
124
|
+
Key: destination.objectKey,
|
|
125
|
+
Body: (0, fs_1.createReadStream)(publishFile.packagedPath),
|
|
126
|
+
ContentType: publishFile.contentType,
|
|
127
|
+
ChecksumAlgorithm: 'SHA256',
|
|
128
|
+
}, paramsEncryption);
|
|
129
|
+
await s3.upload(params);
|
|
130
|
+
}
|
|
131
|
+
async packageFile(source) {
|
|
132
|
+
if (!source.path) {
|
|
133
|
+
throw new Error(`'path' is expected in the File asset source, got: ${JSON.stringify(source)}`);
|
|
134
|
+
}
|
|
135
|
+
const fullPath = path.resolve(this.workDir, source.path);
|
|
136
|
+
if (source.packaging === cloud_assembly_schema_1.FileAssetPackaging.ZIP_DIRECTORY) {
|
|
137
|
+
const contentType = 'application/zip';
|
|
138
|
+
await fs_1.promises.mkdir(this.fileCacheRoot, { recursive: true });
|
|
139
|
+
const packagedPath = path.join(this.fileCacheRoot, `${this.asset.id.assetId}.zip`);
|
|
140
|
+
if (await (0, fs_extra_1.pathExists)(packagedPath)) {
|
|
141
|
+
this.host.emitMessage(progress_1.EventType.CACHED, `From cache ${packagedPath}`);
|
|
142
|
+
return { packagedPath, contentType };
|
|
143
|
+
}
|
|
144
|
+
this.host.emitMessage(progress_1.EventType.BUILD, `Zip ${fullPath} -> ${packagedPath}`);
|
|
145
|
+
await (0, archive_1.zipDirectory)(fullPath, packagedPath, (m) => this.host.emitMessage(progress_1.EventType.DEBUG, m));
|
|
146
|
+
return { packagedPath, contentType };
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const contentType = mime.getType(fullPath) ?? 'application/octet-stream';
|
|
150
|
+
return { packagedPath: fullPath, contentType };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async externalPackageFile(executable) {
|
|
154
|
+
this.host.emitMessage(progress_1.EventType.BUILD, `Building asset source using command: '${executable}'`);
|
|
155
|
+
const shellEventPublisher = (0, progress_1.shellEventPublisherFromEventEmitter)(this.host.emitMessage);
|
|
156
|
+
return {
|
|
157
|
+
packagedPath: (await (0, shell_1.shell)(executable, { subprocessOutputDestination: 'ignore', shellEventPublisher })).trim(),
|
|
158
|
+
contentType: 'application/zip',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.FileAssetHandler = FileAssetHandler;
|
|
163
|
+
var BucketOwnership;
|
|
164
|
+
(function (BucketOwnership) {
|
|
165
|
+
BucketOwnership[BucketOwnership["DOES_NOT_EXIST"] = 0] = "DOES_NOT_EXIST";
|
|
166
|
+
BucketOwnership[BucketOwnership["MINE"] = 1] = "MINE";
|
|
167
|
+
BucketOwnership[BucketOwnership["NO_ACCESS"] = 2] = "NO_ACCESS";
|
|
168
|
+
BucketOwnership[BucketOwnership["SOMEONE_ELSES_AND_HAVE_ACCESS"] = 3] = "SOMEONE_ELSES_AND_HAVE_ACCESS";
|
|
169
|
+
})(BucketOwnership || (BucketOwnership = {}));
|
|
170
|
+
async function objectExists(s3, bucket, key) {
|
|
171
|
+
/*
|
|
172
|
+
* The object existence check here refrains from using the `headObject` operation because this
|
|
173
|
+
* would create a negative cache entry, making GET-after-PUT eventually consistent. This has been
|
|
174
|
+
* observed to result in CloudFormation issuing "ValidationError: S3 error: Access Denied", for
|
|
175
|
+
* example in https://github.com/aws/aws-cdk/issues/6430.
|
|
176
|
+
*
|
|
177
|
+
* To prevent this, we are instead using the listObjectsV2 call, using the looked up key as the
|
|
178
|
+
* prefix, and limiting results to 1. Since the list operation returns keys ordered by binary
|
|
179
|
+
* UTF-8 representation, the key we are looking for is guaranteed to always be the first match
|
|
180
|
+
* returned if it exists.
|
|
181
|
+
*
|
|
182
|
+
* If the file is too small, we discount it as a cache hit. There is an issue
|
|
183
|
+
* somewhere that sometimes produces empty zip files, and we would otherwise
|
|
184
|
+
* never retry building those assets without users having to manually clear
|
|
185
|
+
* their bucket, which is a bad experience.
|
|
186
|
+
*/
|
|
187
|
+
const response = await s3.listObjectsV2({
|
|
188
|
+
Bucket: bucket,
|
|
189
|
+
Prefix: key,
|
|
190
|
+
MaxKeys: 1,
|
|
191
|
+
});
|
|
192
|
+
return (response.Contents != null &&
|
|
193
|
+
response.Contents.some((object) => object.Key === key && (object.Size == null || object.Size > EMPTY_ZIP_FILE_SIZE)));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Cache for bucket information, so we don't have to keep doing the same calls again and again
|
|
197
|
+
*
|
|
198
|
+
* We scope the lifetime of the cache to the lifetime of the host, so that we don't have to do
|
|
199
|
+
* anything special for tests and yet the cache will live for the entire lifetime of the asset
|
|
200
|
+
* upload session when used by the CLI.
|
|
201
|
+
*/
|
|
202
|
+
class BucketInformation {
|
|
203
|
+
static for(host) {
|
|
204
|
+
const existing = BucketInformation.caches.get(host);
|
|
205
|
+
if (existing) {
|
|
206
|
+
return existing;
|
|
207
|
+
}
|
|
208
|
+
const fresh = new BucketInformation();
|
|
209
|
+
BucketInformation.caches.set(host, fresh);
|
|
210
|
+
return fresh;
|
|
211
|
+
}
|
|
212
|
+
constructor() {
|
|
213
|
+
this.ownerships = new Map();
|
|
214
|
+
this.encryptions = new Map();
|
|
215
|
+
}
|
|
216
|
+
async bucketOwnership(s3, bucket, expectedAccount) {
|
|
217
|
+
return cached(this.ownerships, bucket, async () => {
|
|
218
|
+
const anyAccount = await this._bucketOwnership(s3, bucket);
|
|
219
|
+
switch (anyAccount) {
|
|
220
|
+
case BucketOwnership.MINE:
|
|
221
|
+
if (expectedAccount &&
|
|
222
|
+
(await this._bucketOwnership(s3, bucket, expectedAccount)) === BucketOwnership.NO_ACCESS) {
|
|
223
|
+
// if the only difference between MINE and NO_ACCESS is the expected account,
|
|
224
|
+
// then its definitely someone else's bucket.
|
|
225
|
+
return BucketOwnership.SOMEONE_ELSES_AND_HAVE_ACCESS;
|
|
226
|
+
}
|
|
227
|
+
return BucketOwnership.MINE;
|
|
228
|
+
default:
|
|
229
|
+
return anyAccount;
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async bucketEncryption(s3, bucket) {
|
|
234
|
+
return cached(this.encryptions, bucket, () => this._bucketEncryption(s3, bucket));
|
|
235
|
+
}
|
|
236
|
+
async _bucketOwnership(s3, bucket, account) {
|
|
237
|
+
try {
|
|
238
|
+
await s3.getBucketLocation({ Bucket: bucket, ExpectedBucketOwner: account });
|
|
239
|
+
return BucketOwnership.MINE;
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
if (e.name === 'NoSuchBucket') {
|
|
243
|
+
return BucketOwnership.DOES_NOT_EXIST;
|
|
244
|
+
}
|
|
245
|
+
if (['AccessDenied', 'AllAccessDisabled'].includes(e.name)) {
|
|
246
|
+
return BucketOwnership.NO_ACCESS;
|
|
247
|
+
}
|
|
248
|
+
throw e;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
async _bucketEncryption(s3, bucket) {
|
|
252
|
+
try {
|
|
253
|
+
const encryption = await s3.getBucketEncryption({ Bucket: bucket });
|
|
254
|
+
const l = encryption?.ServerSideEncryptionConfiguration?.Rules?.length ?? 0;
|
|
255
|
+
if (l > 0) {
|
|
256
|
+
const apply = encryption?.ServerSideEncryptionConfiguration?.Rules?.at(0)?.ApplyServerSideEncryptionByDefault;
|
|
257
|
+
let ssealgo = apply?.SSEAlgorithm;
|
|
258
|
+
if (ssealgo === 'AES256')
|
|
259
|
+
return { type: 'aes256' };
|
|
260
|
+
if (ssealgo === 'aws:kms')
|
|
261
|
+
return { type: 'kms', kmsKeyId: apply?.KMSMasterKeyID };
|
|
262
|
+
}
|
|
263
|
+
return { type: 'no_encryption' };
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
if (e.name === 'NoSuchBucket') {
|
|
267
|
+
return { type: 'does_not_exist' };
|
|
268
|
+
}
|
|
269
|
+
if (e.name === 'ServerSideEncryptionConfigurationNotFoundError') {
|
|
270
|
+
return { type: 'no_encryption' };
|
|
271
|
+
}
|
|
272
|
+
if (['AccessDenied', 'AllAccessDisabled'].includes(e.name)) {
|
|
273
|
+
return { type: 'access_denied' };
|
|
274
|
+
}
|
|
275
|
+
return { type: 'no_encryption' };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
BucketInformation.caches = new WeakMap();
|
|
280
|
+
async function cached(cache, key, factory) {
|
|
281
|
+
if (cache.has(key)) {
|
|
282
|
+
return cache.get(key);
|
|
283
|
+
}
|
|
284
|
+
const fresh = await factory(key);
|
|
285
|
+
cache.set(key, fresh);
|
|
286
|
+
return fresh;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQkFBc0Q7QUFDdEQsNkJBQTZCO0FBQzdCLDBFQUFnRjtBQUNoRiw2QkFBNkI7QUFDN0IscURBQThEO0FBSTlELDZDQUFnRjtBQUNoRix3Q0FBMEM7QUFFMUMsMENBQXlDO0FBQ3pDLGtEQUF5RDtBQUN6RCxvQ0FBaUM7QUFFakM7Ozs7R0FJRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBRS9CLE1BQWEsZ0JBQWdCO0lBRzNCLFlBQ21CLE9BQWUsRUFDZixLQUF3QixFQUN4QixJQUFrQjtRQUZsQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsU0FBSSxHQUFKLElBQUksQ0FBYztRQUVuQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxLQUFtQixDQUFDO0lBRS9CLEtBQUssQ0FBQyxXQUFXO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxxQ0FBc0IsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sS0FBSyxHQUFHLFFBQVEsV0FBVyxDQUFDLFVBQVUsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLEdBQUcsSUFBQSwyQ0FBMEIsRUFBQyxXQUFXLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FB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SSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBGaWxlQXNzZXRQYWNrYWdpbmcsIEZpbGVTb3VyY2UgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgbWltZSBmcm9tICdtaW1lJztcbmltcG9ydCB7IGRlc3RpbmF0aW9uVG9DbGllbnRPcHRpb25zIH0gZnJvbSAnLi9jbGllbnQtb3B0aW9ucyc7XG5pbXBvcnQgeyBGaWxlTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uLy4uL2Fzc2V0LW1hbmlmZXN0JztcbmltcG9ydCB7IElTM0NsaWVudCB9IGZyb20gJy4uLy4uL2F3cyc7XG5pbXBvcnQgeyBQdXRPYmplY3RDb21tYW5kSW5wdXQgfSBmcm9tICcuLi8uLi9hd3MtdHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBzaGVsbEV2ZW50UHVibGlzaGVyRnJvbUV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL3Byb2dyZXNzJztcbmltcG9ydCB7IHppcERpcmVjdG9yeSB9IGZyb20gJy4uL2FyY2hpdmUnO1xuaW1wb3J0IHsgSUFzc2V0SGFuZGxlciwgSUhhbmRsZXJIb3N0LCB0eXBlIFB1Ymxpc2hPcHRpb25zIH0gZnJvbSAnLi4vYXNzZXQtaGFuZGxlcic7XG5pbXBvcnQgeyBwYXRoRXhpc3RzIH0gZnJvbSAnLi4vZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVwbGFjZUF3c1BsYWNlaG9sZGVycyB9IGZyb20gJy4uL3BsYWNlaG9sZGVycyc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3NoZWxsJztcblxuLyoqXG4gKiBUaGUgc2l6ZSBvZiBhbiBlbXB0eSB6aXAgZmlsZSBpcyAyMiBieXRlc1xuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWklQXyhmaWxlX2Zvcm1hdClcbiAqL1xuY29uc3QgRU1QVFlfWklQX0ZJTEVfU0laRSA9IDIyO1xuXG5leHBvcnQgY2xhc3MgRmlsZUFzc2V0SGFuZGxlciBpbXBsZW1lbnRzIElBc3NldEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVDYWNoZVJvb3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtEaXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0OiBGaWxlTWFuaWZlc3RFbnRyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IElIYW5kbGVySG9zdCxcbiAgKSB7XG4gICAgdGhpcy5maWxlQ2FjaGVSb290ID0gcGF0aC5qb2luKHdvcmtEaXIsICcuY2FjaGUnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgcHVibGljIGFzeW5jIGlzUHVibGlzaGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gYXdhaXQgcmVwbGFjZUF3c1BsYWNlaG9sZGVycyh0aGlzLmFzc2V0LmRlc3RpbmF0aW9uLCB0aGlzLmhvc3QuYXdzKTtcbiAgICBjb25zdCBzM1VybCA9IGBzMzovLyR7ZGVzdGluYXRpb24uYnVja2V0TmFtZX0vJHtkZXN0aW5hdGlvbi5vYmplY3RLZXl9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgczMgPSBhd2FpdCB0aGlzLmhvc3QuYXdzLnMzQ2xpZW50KHtcbiAgICAgICAgLi4uZGVzdGluYXRpb25Ub0NsaWVudE9wdGlvbnMoZGVzdGluYXRpb24pLFxuICAgICAgICBxdWlldDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5DSEVDSywgYENoZWNrICR7czNVcmx9YCk7XG5cbiAgICAgIGlmIChhd2FpdCBvYmplY3RFeGlzdHMoczMsIGRlc3RpbmF0aW9uLmJ1Y2tldE5hbWUsIGRlc3RpbmF0aW9uLm9iamVjdEtleSkpIHtcbiAgICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5GT1VORCwgYEZvdW5kICR7czNVcmx9YCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5ERUJVRywgYCR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHVibGlzaChvcHRpb25zOiBQdWJsaXNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzdGluYXRpb24gPSBhd2FpdCByZXBsYWNlQXdzUGxhY2Vob2xkZXJzKHRoaXMuYXNzZXQuZGVzdGluYXRpb24sIHRoaXMuaG9zdC5hd3MpO1xuICAgIGNvbnN0IHMzVXJsID0gYHMzOi8vJHtkZXN0aW5hdGlvbi5idWNrZXROYW1lfS8ke2Rlc3RpbmF0aW9uLm9iamVjdEtleX1gO1xuXG4gICAgY29uc3QgY2xpZW50T3B0aW9ucyA9IGRlc3RpbmF0aW9uVG9DbGllbnRPcHRpb25zKGRlc3RpbmF0aW9uKTtcbiAgICBjb25zdCBzMyA9IGF3YWl0IHRoaXMuaG9zdC5hd3MuczNDbGllbnQoY2xpZW50T3B0aW9ucyk7XG4gICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5DSEVDSywgYENoZWNrICR7czNVcmx9YCk7XG5cbiAgICBjb25zdCBidWNrZXRJbmZvID0gQnVja2V0SW5mb3JtYXRpb24uZm9yKHRoaXMuaG9zdCk7XG5cbiAgICAvLyBBIHRodW5rIGZvciBkZXNjcmliaW5nIHRoZSBjdXJyZW50IGFjY291bnQuIFVzZWQgd2hlbiB3ZSBuZWVkIHRvIGZvcm1hdCBhbiBlcnJvclxuICAgIC8vIG1lc3NhZ2UsIG5vdCBpbiB0aGUgc3VjY2VzcyBjYXNlLlxuICAgIGNvbnN0IGFjY291bnQgPSBhc3luYyAoKSA9PlxuICAgICAgKGF3YWl0IHRoaXMuaG9zdC5hd3MuZGlzY292ZXJUYXJnZXRBY2NvdW50KGNsaWVudE9wdGlvbnMpKS5hY2NvdW50SWQ7XG5cbiAgICBjb25zdCBhbGxvd0Nyb3NzQWNjb3VudCA9IG9wdGlvbnMuYWxsb3dDcm9zc0FjY291bnQgPz8gdHJ1ZTtcbiAgICBzd2l0Y2ggKFxuICAgICAgYXdhaXQgYnVja2V0SW5mby5idWNrZXRPd25lcnNoaXAoXG4gICAgICAgIHMzLFxuICAgICAgICBkZXN0aW5hdGlvbi5idWNrZXROYW1lLFxuICAgICAgICBhbGxvd0Nyb3NzQWNjb3VudCA/IHVuZGVmaW5lZCA6IGF3YWl0IGFjY291bnQoKSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNhc2UgQnVja2V0T3duZXJzaGlwLk1JTkU6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCdWNrZXRPd25lcnNoaXAuRE9FU19OT1RfRVhJU1Q6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gYnVja2V0IG5hbWVkICcke2Rlc3RpbmF0aW9uLmJ1Y2tldE5hbWV9Jy4gSXMgYWNjb3VudCAke2F3YWl0IGFjY291bnQoKX0gYm9vdHN0cmFwcGVkP2AsXG4gICAgICAgICk7XG4gICAgICBjYXNlIEJ1Y2tldE93bmVyc2hpcC5OT19BQ0NFU1M6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQnVja2V0IG5hbWVkICcke2Rlc3RpbmF0aW9uLmJ1Y2tldE5hbWV9JyBleGlzdHMsIGJ1dCB3ZSBkb250IGhhdmUgYWNjZXNzIHRvIGl0LmAsXG4gICAgICAgICk7XG4gICAgICBjYXNlIEJ1Y2tldE93bmVyc2hpcC5TT01FT05FX0VMU0VTX0FORF9IQVZFX0FDQ0VTUzpcbiAgICAgICAgaWYgKCFhbGxvd0Nyb3NzQWNjb3VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGDinZfinZcgVU5FWFBFQ1RFRCBCVUNLRVQgT1dORVIgREVURUNURUQg4p2X4p2XXG5cbiAgICAgICAgICAgICAgV2UndmUgZGV0ZWN0ZWQgdGhhdCB0aGUgUzMgYnVja2V0ICR7ZGVzdGluYXRpb24uYnVja2V0TmFtZX0gd2FzXG4gICAgICAgICAgICAgIG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBhY2NvdW50ICR7YXdhaXQgYWNjb3VudCgpfSBhcyBwYXJ0IG9mIHRoZSBDbG91ZEZvcm1hdGlvbiBzdGFjayBDREtUb29sa2l0LFxuICAgICAgICAgICAgICBidXQgbm93IHJlc2lkZXMgaW4gYSBkaWZmZXJlbnQgQVdTIGFjY291bnQuIFRvIHByZXZlbnQgY3Jvc3MtYWNjb3VudCBhc3NldCBidWNrZXQgYWNjZXNzIG9mIHlvdXJcbiAgICAgICAgICAgICAgZGVwbG95bWVudHMsIENESyB3aWxsIHN0b3Agbm93LlxuXG4gICAgICAgICAgICAgIElmIHRoaXMgc2l0dWF0aW9uIGlzIGludGVudGlvbmFsIGFuZCB5b3Ugb3duIHRoZSBBV1MgYWNjb3VudCB0aGF0IHRoZSBidWNrZXQgaGFzIG1vdmVkIHRvLCByZW1vdmUgdGhlXG4gICAgICAgICAgICAgIHJlc291cmNlIG5hbWVkIFN0YWdpbmdCdWNrZXQgZnJvbSB0aGUgdGVtcGxhdGUgb2YgQ2xvdWRGb3JtYXRpb24gc3RhY2sgQ0RLVG9vbGtpdCBhbmQgdHJ5IGFnYWluLlxuXG4gICAgICAgICAgICAgIElmIHRoaXMgc2l0dWF0aW9uIGlzIG5vdCBpbnRlbnRpb25hbCwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIGF1ZGl0aW5nIHlvdXIgYWNjb3VudCB0byBtYWtlIHN1cmUgYWxsXG4gICAgICAgICAgICAgIHJlc291cmNlcyBhcmUgY29uZmlndXJlZCB0aGUgd2F5IHlvdSBleHBlY3QgdGhlbSBbMV0uIEZvciBxdWVzdGlvbnMgb3IgY29uY2VybnMsIHBsZWFzZSBjb250YWN0XG4gICAgICAgICAgICAgIEFXUyBTdXBwb3J0IFsyXS5cblxuICAgICAgICAgICAgICBbMV0gaHR0cHM6Ly9yZXBvc3QuYXdzL2tub3dsZWRnZS1jZW50ZXIvcG90ZW50aWFsLWFjY291bnQtY29tcHJvbWlzZVxuXG4gICAgICAgICAgICAgIFsyXSBodHRwczovL2F3cy5hbWF6b24uY29tL3N1cHBvcnRgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IG9iamVjdEV4aXN0cyhzMywgZGVzdGluYXRpb24uYnVja2V0TmFtZSwgZGVzdGluYXRpb24ub2JqZWN0S2V5KSkge1xuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5GT1VORCwgYEZvdW5kICR7czNVcmx9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWRlbnRpZnkgdGhlIHRoZSBidWNrZXQgZW5jcnlwdGlvbiB0eXBlIHRvIHNldCB0aGUgaGVhZGVyIG9uIHVwbG9hZFxuICAgIC8vIHJlcXVpcmVkIGZvciBTQ1AgcnVsZXMgZGVueWluZyB1cGxvYWRzIHdpdGhvdXQgZW5jcnlwdGlvbiBoZWFkZXJcbiAgICBsZXQgcGFyYW1zRW5jcnlwdGlvbjogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgY29uc3QgZW5jcnlwdGlvbjIgPSBhd2FpdCBidWNrZXRJbmZvLmJ1Y2tldEVuY3J5cHRpb24oczMsIGRlc3RpbmF0aW9uLmJ1Y2tldE5hbWUpO1xuICAgIHN3aXRjaCAoZW5jcnlwdGlvbjIudHlwZSkge1xuICAgICAgY2FzZSAnbm9fZW5jcnlwdGlvbic6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWVzMjU2JzpcbiAgICAgICAgcGFyYW1zRW5jcnlwdGlvbiA9IHsgU2VydmVyU2lkZUVuY3J5cHRpb246ICdBRVMyNTYnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna21zJzpcbiAgICAgICAgLy8gV2UgbXVzdCBpbmNsdWRlIHRoZSBrZXkgSUQgb3RoZXJ3aXNlIFMzIHdpbGwgZW5jcnlwdCB3aXRoIHRoZSBkZWZhdWx0IGtleVxuICAgICAgICBwYXJhbXNFbmNyeXB0aW9uID0ge1xuICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uOiAnYXdzOmttcycsXG4gICAgICAgICAgU1NFS01TS2V5SWQ6IGVuY3J5cHRpb24yLmttc0tleUlkLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RvZXNfbm90X2V4aXN0JzpcbiAgICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKFxuICAgICAgICAgIEV2ZW50VHlwZS5ERUJVRyxcbiAgICAgICAgICBgTm8gYnVja2V0IG5hbWVkICcke2Rlc3RpbmF0aW9uLmJ1Y2tldE5hbWV9Jy4gSXMgYWNjb3VudCAke2F3YWl0IGFjY291bnQoKX0gYm9vdHN0cmFwcGVkP2AsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWNjZXNzX2RlbmllZCc6XG4gICAgICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShcbiAgICAgICAgICBFdmVudFR5cGUuREVCVUcsXG4gICAgICAgICAgYENvdWxkIG5vdCByZWFkIGVuY3J5cHRpb24gc2V0dGluZ3Mgb2YgYnVja2V0ICcke2Rlc3RpbmF0aW9uLmJ1Y2tldE5hbWV9JzogdXBsb2FkaW5nIHdpdGggZGVmYXVsdCBzZXR0aW5ncyAoXCJjZGsgYm9vdHN0cmFwXCIgdG8gdmVyc2lvbiA5IGlmIHlvdXIgb3JnYW5pemF0aW9uJ3MgcG9saWNpZXMgcHJldmVudCBhIHN1Y2Nlc3NmdWwgdXBsb2FkIG9yIHRvIGdldCByaWQgb2YgdGhpcyBtZXNzYWdlKS5gLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHVibGlzaEZpbGUgPSB0aGlzLmFzc2V0LnNvdXJjZS5leGVjdXRhYmxlXG4gICAgICA/IGF3YWl0IHRoaXMuZXh0ZXJuYWxQYWNrYWdlRmlsZSh0aGlzLmFzc2V0LnNvdXJjZS5leGVjdXRhYmxlKVxuICAgICAgOiBhd2FpdCB0aGlzLnBhY2thZ2VGaWxlKHRoaXMuYXNzZXQuc291cmNlKTtcblxuICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuVVBMT0FELCBgVXBsb2FkICR7czNVcmx9YCk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIEJ1Y2tldDogZGVzdGluYXRpb24uYnVja2V0TmFtZSxcbiAgICAgICAgS2V5OiBkZXN0aW5hdGlvbi5vYmplY3RLZXksXG4gICAgICAgIEJvZHk6IGNyZWF0ZVJlYWRTdHJlYW0ocHVibGlzaEZpbGUucGFja2FnZWRQYXRoKSxcbiAgICAgICAgQ29udGVudFR5cGU6IHB1Ymxpc2hGaWxlLmNvbnRlbnRUeXBlLFxuICAgICAgICBDaGVja3N1bUFsZ29yaXRobTogJ1NIQTI1NicsXG4gICAgICB9IHNhdGlzZmllcyBQdXRPYmplY3RDb21tYW5kSW5wdXQsXG4gICAgICBwYXJhbXNFbmNyeXB0aW9uLFxuICAgICk7XG5cbiAgICBhd2FpdCBzMy51cGxvYWQocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGFja2FnZUZpbGUoc291cmNlOiBGaWxlU291cmNlKTogUHJvbWlzZTxQYWNrYWdlZEZpbGVBc3NldD4ge1xuICAgIGlmICghc291cmNlLnBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCdwYXRoJyBpcyBleHBlY3RlZCBpbiB0aGUgRmlsZSBhc3NldCBzb3VyY2UsIGdvdDogJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMud29ya0Rpciwgc291cmNlLnBhdGgpO1xuXG4gICAgaWYgKHNvdXJjZS5wYWNrYWdpbmcgPT09IEZpbGVBc3NldFBhY2thZ2luZy5aSVBfRElSRUNUT1JZKSB7XG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi96aXAnO1xuXG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLmZpbGVDYWNoZVJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc3QgcGFja2FnZWRQYXRoID0gcGF0aC5qb2luKHRoaXMuZmlsZUNhY2hlUm9vdCwgYCR7dGhpcy5hc3NldC5pZC5hc3NldElkfS56aXBgKTtcblxuICAgICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMocGFja2FnZWRQYXRoKSkge1xuICAgICAgICB0aGlzLmhvc3QuZW1pdE1lc3NhZ2UoRXZlbnRUeXBlLkNBQ0hFRCwgYEZyb20gY2FjaGUgJHtwYWNrYWdlZFBhdGh9YCk7XG4gICAgICAgIHJldHVybiB7IHBhY2thZ2VkUGF0aCwgY29udGVudFR5cGUgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5CVUlMRCwgYFppcCAke2Z1bGxQYXRofSAtPiAke3BhY2thZ2VkUGF0aH1gKTtcbiAgICAgIGF3YWl0IHppcERpcmVjdG9yeShmdWxsUGF0aCwgcGFja2FnZWRQYXRoLCAobSkgPT4gdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5ERUJVRywgbSkpO1xuICAgICAgcmV0dXJuIHsgcGFja2FnZWRQYXRoLCBjb250ZW50VHlwZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IG1pbWUuZ2V0VHlwZShmdWxsUGF0aCkgPz8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICByZXR1cm4geyBwYWNrYWdlZFBhdGg6IGZ1bGxQYXRoLCBjb250ZW50VHlwZSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0ZXJuYWxQYWNrYWdlRmlsZShleGVjdXRhYmxlOiBzdHJpbmdbXSk6IFByb21pc2U8UGFja2FnZWRGaWxlQXNzZXQ+IHtcbiAgICB0aGlzLmhvc3QuZW1pdE1lc3NhZ2UoRXZlbnRUeXBlLkJVSUxELCBgQnVpbGRpbmcgYXNzZXQgc291cmNlIHVzaW5nIGNvbW1hbmQ6ICcke2V4ZWN1dGFibGV9J2ApO1xuXG4gICAgY29uc3Qgc2hlbGxFdmVudFB1Ymxpc2hlciA9IHNoZWxsRXZlbnRQdWJsaXNoZXJGcm9tRXZlbnRFbWl0dGVyKHRoaXMuaG9zdC5lbWl0TWVzc2FnZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFja2FnZWRQYXRoOiAoXG4gICAgICAgIGF3YWl0IHNoZWxsKGV4ZWN1dGFibGUsIHsgc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uOiAnaWdub3JlJywgc2hlbGxFdmVudFB1Ymxpc2hlciB9KVxuICAgICAgKS50cmltKCksXG4gICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgfTtcbiAgfVxufVxuXG5lbnVtIEJ1Y2tldE93bmVyc2hpcCB7XG4gIERPRVNfTk9UX0VYSVNULFxuICBNSU5FLFxuICBOT19BQ0NFU1MsXG4gIFNPTUVPTkVfRUxTRVNfQU5EX0hBVkVfQUNDRVNTLFxufVxuXG50eXBlIEJ1Y2tldEVuY3J5cHRpb24gPVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ25vX2VuY3J5cHRpb24nIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdhZXMyNTYnIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdrbXMnOyByZWFkb25seSBrbXNLZXlJZD86IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnYWNjZXNzX2RlbmllZCcgfVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ2RvZXNfbm90X2V4aXN0JyB9O1xuXG5hc3luYyBmdW5jdGlvbiBvYmplY3RFeGlzdHMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gIC8qXG4gICAqIFRoZSBvYmplY3QgZXhpc3RlbmNlIGNoZWNrIGhlcmUgcmVmcmFpbnMgZnJvbSB1c2luZyB0aGUgYGhlYWRPYmplY3RgIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXNcbiAgICogd291bGQgY3JlYXRlIGEgbmVnYXRpdmUgY2FjaGUgZW50cnksIG1ha2luZyBHRVQtYWZ0ZXItUFVUIGV2ZW50dWFsbHkgY29uc2lzdGVudC4gVGhpcyBoYXMgYmVlblxuICAgKiBvYnNlcnZlZCB0byByZXN1bHQgaW4gQ2xvdWRGb3JtYXRpb24gaXNzdWluZyBcIlZhbGlkYXRpb25FcnJvcjogUzMgZXJyb3I6IEFjY2VzcyBEZW5pZWRcIiwgZm9yXG4gICAqIGV4YW1wbGUgaW4gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy82NDMwLlxuICAgKlxuICAgKiBUbyBwcmV2ZW50IHRoaXMsIHdlIGFyZSBpbnN0ZWFkIHVzaW5nIHRoZSBsaXN0T2JqZWN0c1YyIGNhbGwsIHVzaW5nIHRoZSBsb29rZWQgdXAga2V5IGFzIHRoZVxuICAgKiBwcmVmaXgsIGFuZCBsaW1pdGluZyByZXN1bHRzIHRvIDEuIFNpbmNlIHRoZSBsaXN0IG9wZXJhdGlvbiByZXR1cm5zIGtleXMgb3JkZXJlZCBieSBiaW5hcnlcbiAgICogVVRGLTggcmVwcmVzZW50YXRpb24sIHRoZSBrZXkgd2UgYXJlIGxvb2tpbmcgZm9yIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIGJlIHRoZSBmaXJzdCBtYXRjaFxuICAgKiByZXR1cm5lZCBpZiBpdCBleGlzdHMuXG4gICAqXG4gICAqIElmIHRoZSBmaWxlIGlzIHRvbyBzbWFsbCwgd2UgZGlzY291bnQgaXQgYXMgYSBjYWNoZSBoaXQuIFRoZXJlIGlzIGFuIGlzc3VlXG4gICAqIHNvbWV3aGVyZSB0aGF0IHNvbWV0aW1lcyBwcm9kdWNlcyBlbXB0eSB6aXAgZmlsZXMsIGFuZCB3ZSB3b3VsZCBvdGhlcndpc2VcbiAgICogbmV2ZXIgcmV0cnkgYnVpbGRpbmcgdGhvc2UgYXNzZXRzIHdpdGhvdXQgdXNlcnMgaGF2aW5nIHRvIG1hbnVhbGx5IGNsZWFyXG4gICAqIHRoZWlyIGJ1Y2tldCwgd2hpY2ggaXMgYSBiYWQgZXhwZXJpZW5jZS5cbiAgICovXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgczMubGlzdE9iamVjdHNWMih7XG4gICAgQnVja2V0OiBidWNrZXQsXG4gICAgUHJlZml4OiBrZXksXG4gICAgTWF4S2V5czogMSxcbiAgfSk7XG4gIHJldHVybiAoXG4gICAgcmVzcG9uc2UuQ29udGVudHMgIT0gbnVsbCAmJlxuICAgIHJlc3BvbnNlLkNvbnRlbnRzLnNvbWUoXG4gICAgICAob2JqZWN0KSA9PiBvYmplY3QuS2V5ID09PSBrZXkgJiYgKG9iamVjdC5TaXplID09IG51bGwgfHwgb2JqZWN0LlNpemUgPiBFTVBUWV9aSVBfRklMRV9TSVpFKSxcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQSBwYWNrYWdlZCBhc3NldCB3aGljaCBjYW4gYmUgdXBsb2FkZWQgKGVpdGhlciBhIHNpbmdsZSBmaWxlIG9yIGRpcmVjdG9yeSlcbiAqL1xuaW50ZXJmYWNlIFBhY2thZ2VkRmlsZUFzc2V0IHtcbiAgLyoqXG4gICAqIFBhdGggb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5XG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlZFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGVudCB0eXBlIHRvIGJlIGFkZGVkIGluIHRoZSBTMyB1cGxvYWQgYWN0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29udGVudCB0eXBlXG4gICAqL1xuICByZWFkb25seSBjb250ZW50VHlwZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDYWNoZSBmb3IgYnVja2V0IGluZm9ybWF0aW9uLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgZG9pbmcgdGhlIHNhbWUgY2FsbHMgYWdhaW4gYW5kIGFnYWluXG4gKlxuICogV2Ugc2NvcGUgdGhlIGxpZmV0aW1lIG9mIHRoZSBjYWNoZSB0byB0aGUgbGlmZXRpbWUgb2YgdGhlIGhvc3QsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBkb1xuICogYW55dGhpbmcgc3BlY2lhbCBmb3IgdGVzdHMgYW5kIHlldCB0aGUgY2FjaGUgd2lsbCBsaXZlIGZvciB0aGUgZW50aXJlIGxpZmV0aW1lIG9mIHRoZSBhc3NldFxuICogdXBsb2FkIHNlc3Npb24gd2hlbiB1c2VkIGJ5IHRoZSBDTEkuXG4gKi9cbmNsYXNzIEJ1Y2tldEluZm9ybWF0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBmb3IoaG9zdDogSUhhbmRsZXJIb3N0KSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBCdWNrZXRJbmZvcm1hdGlvbi5jYWNoZXMuZ2V0KGhvc3QpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cblxuICAgIGNvbnN0IGZyZXNoID0gbmV3IEJ1Y2tldEluZm9ybWF0aW9uKCk7XG4gICAgQnVja2V0SW5mb3JtYXRpb24uY2FjaGVzLnNldChob3N0LCBmcmVzaCk7XG4gICAgcmV0dXJuIGZyZXNoO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2FjaGVzID0gbmV3IFdlYWtNYXA8SUhhbmRsZXJIb3N0LCBCdWNrZXRJbmZvcm1hdGlvbj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG93bmVyc2hpcHMgPSBuZXcgTWFwPHN0cmluZywgQnVja2V0T3duZXJzaGlwPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY3J5cHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEJ1Y2tldEVuY3J5cHRpb24+KCk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHVibGljIGFzeW5jIGJ1Y2tldE93bmVyc2hpcChcbiAgICBzMzogSVMzQ2xpZW50LFxuICAgIGJ1Y2tldDogc3RyaW5nLFxuICAgIGV4cGVjdGVkQWNjb3VudD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxCdWNrZXRPd25lcnNoaXA+IHtcbiAgICByZXR1cm4gY2FjaGVkKHRoaXMub3duZXJzaGlwcywgYnVja2V0LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhbnlBY2NvdW50ID0gYXdhaXQgdGhpcy5fYnVja2V0T3duZXJzaGlwKHMzLCBidWNrZXQpO1xuXG4gICAgICBzd2l0Y2ggKGFueUFjY291bnQpIHtcbiAgICAgICAgY2FzZSBCdWNrZXRPd25lcnNoaXAuTUlORTpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBleHBlY3RlZEFjY291bnQgJiZcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLl9idWNrZXRPd25lcnNoaXAoczMsIGJ1Y2tldCwgZXhwZWN0ZWRBY2NvdW50KSkgPT09IEJ1Y2tldE93bmVyc2hpcC5OT19BQ0NFU1NcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBNSU5FIGFuZCBOT19BQ0NFU1MgaXMgdGhlIGV4cGVjdGVkIGFjY291bnQsXG4gICAgICAgICAgICAvLyB0aGVuIGl0cyBkZWZpbml0ZWx5IHNvbWVvbmUgZWxzZSdzIGJ1Y2tldC5cbiAgICAgICAgICAgIHJldHVybiBCdWNrZXRPd25lcnNoaXAuU09NRU9ORV9FTFNFU19BTkRfSEFWRV9BQ0NFU1M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBCdWNrZXRPd25lcnNoaXAuTUlORTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYW55QWNjb3VudDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBidWNrZXRFbmNyeXB0aW9uKHMzOiBJUzNDbGllbnQsIGJ1Y2tldDogc3RyaW5nKTogUHJvbWlzZTxCdWNrZXRFbmNyeXB0aW9uPiB7XG4gICAgcmV0dXJuIGNhY2hlZCh0aGlzLmVuY3J5cHRpb25zLCBidWNrZXQsICgpID0+IHRoaXMuX2J1Y2tldEVuY3J5cHRpb24oczMsIGJ1Y2tldCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfYnVja2V0T3duZXJzaGlwKFxuICAgIHMzOiBJUzNDbGllbnQsXG4gICAgYnVja2V0OiBzdHJpbmcsXG4gICAgYWNjb3VudD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxCdWNrZXRPd25lcnNoaXAuTUlORSB8IEJ1Y2tldE93bmVyc2hpcC5ET0VTX05PVF9FWElTVCB8IEJ1Y2tldE93bmVyc2hpcC5OT19BQ0NFU1M+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgczMuZ2V0QnVja2V0TG9jYXRpb24oeyBCdWNrZXQ6IGJ1Y2tldCwgRXhwZWN0ZWRCdWNrZXRPd25lcjogYWNjb3VudCB9KTtcbiAgICAgIHJldHVybiBCdWNrZXRPd25lcnNoaXAuTUlORTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlLm5hbWUgPT09ICdOb1N1Y2hCdWNrZXQnKSB7XG4gICAgICAgIHJldHVybiBCdWNrZXRPd25lcnNoaXAuRE9FU19OT1RfRVhJU1Q7XG4gICAgICB9XG4gICAgICBpZiAoWydBY2Nlc3NEZW5pZWQnLCAnQWxsQWNjZXNzRGlzYWJsZWQnXS5pbmNsdWRlcyhlLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiBCdWNrZXRPd25lcnNoaXAuTk9fQUNDRVNTO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9idWNrZXRFbmNyeXB0aW9uKHMzOiBJUzNDbGllbnQsIGJ1Y2tldDogc3RyaW5nKTogUHJvbWlzZTxCdWNrZXRFbmNyeXB0aW9uPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb24gPSBhd2FpdCBzMy5nZXRCdWNrZXRFbmNyeXB0aW9uKHsgQnVja2V0OiBidWNrZXQgfSk7XG4gICAgICBjb25zdCBsID0gZW5jcnlwdGlvbj8uU2VydmVyU2lkZUVuY3J5cHRpb25Db25maWd1cmF0aW9uPy5SdWxlcz8ubGVuZ3RoID8/IDA7XG4gICAgICBpZiAobCA+IDApIHtcbiAgICAgICAgY29uc3QgYXBwbHkgPVxuICAgICAgICAgIGVuY3J5cHRpb24/LlNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbj8uUnVsZXM/LmF0KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICApPy5BcHBseVNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0O1xuICAgICAgICBsZXQgc3NlYWxnbyA9IGFwcGx5Py5TU0VBbGdvcml0aG07XG4gICAgICAgIGlmIChzc2VhbGdvID09PSAnQUVTMjU2JykgcmV0dXJuIHsgdHlwZTogJ2FlczI1NicgfTtcbiAgICAgICAgaWYgKHNzZWFsZ28gPT09ICdhd3M6a21zJykgcmV0dXJuIHsgdHlwZTogJ2ttcycsIGttc0tleUlkOiBhcHBseT8uS01TTWFzdGVyS2V5SUQgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHR5cGU6ICdub19lbmNyeXB0aW9uJyB9O1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUubmFtZSA9PT0gJ05vU3VjaEJ1Y2tldCcpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2RvZXNfbm90X2V4aXN0JyB9O1xuICAgICAgfVxuICAgICAgaWYgKGUubmFtZSA9PT0gJ1NlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbk5vdEZvdW5kRXJyb3InKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdub19lbmNyeXB0aW9uJyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoWydBY2Nlc3NEZW5pZWQnLCAnQWxsQWNjZXNzRGlzYWJsZWQnXS5pbmNsdWRlcyhlLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdhY2Nlc3NfZGVuaWVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHlwZTogJ25vX2VuY3J5cHRpb24nIH07XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhY2hlZDxBLCBCPihjYWNoZTogTWFwPEEsIEI+LCBrZXk6IEEsIGZhY3Rvcnk6ICh4OiBBKSA9PiBQcm9taXNlPEI+KTogUHJvbWlzZTxCPiB7XG4gIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KSE7XG4gIH1cblxuICBjb25zdCBmcmVzaCA9IGF3YWl0IGZhY3Rvcnkoa2V5KTtcbiAgY2FjaGUuc2V0KGtleSwgZnJlc2gpO1xuICByZXR1cm4gZnJlc2g7XG59XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type AssetManifest, type IManifestEntry } from '../../asset-manifest';
|
|
2
|
+
import type { IAssetHandler, IHandlerHost, IHandlerOptions } from '../asset-handler';
|
|
3
|
+
export declare function makeAssetHandler(manifest: AssetManifest, asset: IManifestEntry, host: IHandlerHost, options: IHandlerOptions): IAssetHandler;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeAssetHandler = makeAssetHandler;
|
|
4
|
+
const container_images_1 = require("./container-images");
|
|
5
|
+
const files_1 = require("./files");
|
|
6
|
+
const asset_manifest_1 = require("../../asset-manifest");
|
|
7
|
+
function makeAssetHandler(manifest, asset, host, options) {
|
|
8
|
+
if (asset instanceof asset_manifest_1.FileManifestEntry) {
|
|
9
|
+
return new files_1.FileAssetHandler(manifest.directory, asset, host);
|
|
10
|
+
}
|
|
11
|
+
if (asset instanceof asset_manifest_1.DockerImageManifestEntry) {
|
|
12
|
+
return new container_images_1.ContainerImageAssetHandler(manifest.directory, asset, host, options);
|
|
13
|
+
}
|
|
14
|
+
throw new Error(`Unrecognized asset type: '${asset}'`);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVVBLDRDQWNDO0FBeEJELHlEQUFnRTtBQUNoRSxtQ0FBMkM7QUFDM0MseURBSzhCO0FBRzlCLFNBQWdCLGdCQUFnQixDQUM5QixRQUF1QixFQUN2QixLQUFxQixFQUNyQixJQUFrQixFQUNsQixPQUF3QjtJQUV4QixJQUFJLEtBQUssWUFBWSxrQ0FBaUIsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSx3QkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxLQUFLLFlBQVkseUNBQXdCLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksNkNBQTBCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250YWluZXJJbWFnZUFzc2V0SGFuZGxlciB9IGZyb20gJy4vY29udGFpbmVyLWltYWdlcyc7XG5pbXBvcnQgeyBGaWxlQXNzZXRIYW5kbGVyIH0gZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQge1xuICB0eXBlIEFzc2V0TWFuaWZlc3QsXG4gIERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSxcbiAgRmlsZU1hbmlmZXN0RW50cnksXG4gIHR5cGUgSU1hbmlmZXN0RW50cnksXG59IGZyb20gJy4uLy4uL2Fzc2V0LW1hbmlmZXN0JztcbmltcG9ydCB0eXBlIHsgSUFzc2V0SGFuZGxlciwgSUhhbmRsZXJIb3N0LCBJSGFuZGxlck9wdGlvbnMgfSBmcm9tICcuLi9hc3NldC1oYW5kbGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VBc3NldEhhbmRsZXIoXG4gIG1hbmlmZXN0OiBBc3NldE1hbmlmZXN0LFxuICBhc3NldDogSU1hbmlmZXN0RW50cnksXG4gIGhvc3Q6IElIYW5kbGVySG9zdCxcbiAgb3B0aW9uczogSUhhbmRsZXJPcHRpb25zLFxuKTogSUFzc2V0SGFuZGxlciB7XG4gIGlmIChhc3NldCBpbnN0YW5jZW9mIEZpbGVNYW5pZmVzdEVudHJ5KSB7XG4gICAgcmV0dXJuIG5ldyBGaWxlQXNzZXRIYW5kbGVyKG1hbmlmZXN0LmRpcmVjdG9yeSwgYXNzZXQsIGhvc3QpO1xuICB9XG4gIGlmIChhc3NldCBpbnN0YW5jZW9mIERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSkge1xuICAgIHJldHVybiBuZXcgQ29udGFpbmVySW1hZ2VBc3NldEhhbmRsZXIobWFuaWZlc3QuZGlyZWN0b3J5LCBhc3NldCwgaG9zdCwgb3B0aW9ucyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBhc3NldCB0eXBlOiAnJHthc3NldH0nYCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal of p-limit that does not bring in new dependencies, and is not ESM.
|
|
3
|
+
*/
|
|
4
|
+
type PromiseFactory<A> = () => Promise<A>;
|
|
5
|
+
export declare function pLimit(concurrency: number): PLimit;
|
|
6
|
+
interface PLimit {
|
|
7
|
+
dispose(): void;
|
|
8
|
+
<A>(promiseFactory: PromiseFactory<A>): Promise<A>;
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A minimal of p-limit that does not bring in new dependencies, and is not ESM.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.pLimit = pLimit;
|
|
7
|
+
function pLimit(concurrency) {
|
|
8
|
+
const queue = [];
|
|
9
|
+
let activeCount = 0;
|
|
10
|
+
let stopped = false;
|
|
11
|
+
function dispatch() {
|
|
12
|
+
if (activeCount < concurrency && queue.length > 0) {
|
|
13
|
+
const [fac, resolve, reject] = queue.shift();
|
|
14
|
+
activeCount++;
|
|
15
|
+
fac().then((r) => {
|
|
16
|
+
// Start a new job before reporting back on the previous one
|
|
17
|
+
resumeNext();
|
|
18
|
+
resolve(r);
|
|
19
|
+
}, (e) => {
|
|
20
|
+
// Start a new job before reporting back on the previous one
|
|
21
|
+
resumeNext();
|
|
22
|
+
reject(e);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function resumeNext() {
|
|
27
|
+
activeCount--;
|
|
28
|
+
if (stopped) {
|
|
29
|
+
for (const [_, __, reject] of queue) {
|
|
30
|
+
reject(new Error('Task has been cancelled'));
|
|
31
|
+
}
|
|
32
|
+
queue.splice(0, queue.length);
|
|
33
|
+
}
|
|
34
|
+
dispatch();
|
|
35
|
+
}
|
|
36
|
+
const ret = (promiseFactory) => {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
queue.push([promiseFactory, resolve, reject]);
|
|
39
|
+
dispatch();
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperties(ret, {
|
|
43
|
+
dispose: {
|
|
44
|
+
value: () => {
|
|
45
|
+
stopped = true;
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
return ret;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicC1saW1pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInAtbGltaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOztBQUlILHdCQWtEQztBQWxERCxTQUFnQixNQUFNLENBQUMsV0FBbUI7SUFDeEMsTUFBTSxLQUFLLEdBQTJFLEVBQUUsQ0FBQztJQUN6RixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDcEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXBCLFNBQVMsUUFBUTtRQUNmLElBQUksV0FBVyxHQUFHLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUcsQ0FBQztZQUM5QyxXQUFXLEVBQUUsQ0FBQztZQUNkLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDUixDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNKLDREQUE0RDtnQkFDNUQsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2IsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0osNERBQTREO2dCQUM1RCxVQUFVLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxVQUFVO1FBQ2pCLFdBQVcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBSSxjQUFpQyxFQUFFLEVBQUU7UUFDbkQsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1FBQzNCLE9BQU8sRUFBRTtZQUNQLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNqQixDQUFDO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFFSCxPQUFPLEdBQWEsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIG1pbmltYWwgIG9mIHAtbGltaXQgdGhhdCBkb2VzIG5vdCBicmluZyBpbiBuZXcgZGVwZW5kZW5jaWVzLCBhbmQgaXMgbm90IEVTTS5cbiAqL1xuXG50eXBlIFByb21pc2VGYWN0b3J5PEE+ID0gKCkgPT4gUHJvbWlzZTxBPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBMaW1pdChjb25jdXJyZW5jeTogbnVtYmVyKTogUExpbWl0IHtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtQcm9taXNlRmFjdG9yeTxhbnk+LCAoeDogYW55KSA9PiB2b2lkLCAocmVhc29uPzogYW55KSA9PiB2b2lkXT4gPSBbXTtcbiAgbGV0IGFjdGl2ZUNvdW50ID0gMDtcbiAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICBpZiAoYWN0aXZlQ291bnQgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbZmFjLCByZXNvbHZlLCByZWplY3RdID0gcXVldWUuc2hpZnQoKSE7XG4gICAgICBhY3RpdmVDb3VudCsrO1xuICAgICAgZmFjKCkudGhlbihcbiAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAvLyBTdGFydCBhIG5ldyBqb2IgYmVmb3JlIHJlcG9ydGluZyBiYWNrIG9uIHRoZSBwcmV2aW91cyBvbmVcbiAgICAgICAgICByZXN1bWVOZXh0KCk7XG4gICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAvLyBTdGFydCBhIG5ldyBqb2IgYmVmb3JlIHJlcG9ydGluZyBiYWNrIG9uIHRoZSBwcmV2aW91cyBvbmVcbiAgICAgICAgICByZXN1bWVOZXh0KCk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWVOZXh0KCkge1xuICAgIGFjdGl2ZUNvdW50LS07XG4gICAgaWYgKHN0b3BwZWQpIHtcbiAgICAgIGZvciAoY29uc3QgW18sIF9fLCByZWplY3RdIG9mIHF1ZXVlKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Rhc2sgaGFzIGJlZW4gY2FuY2VsbGVkJykpO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKDAsIHF1ZXVlLmxlbmd0aCk7XG4gICAgfVxuICAgIGRpc3BhdGNoKCk7XG4gIH1cblxuICBjb25zdCByZXQgPSA8QT4ocHJvbWlzZUZhY3Rvcnk6IFByb21pc2VGYWN0b3J5PEE+KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEE+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHF1ZXVlLnB1c2goW3Byb21pc2VGYWN0b3J5LCByZXNvbHZlLCByZWplY3RdKTtcbiAgICAgIGRpc3BhdGNoKCk7XG4gICAgfSk7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJldCwge1xuICAgIGRpc3Bvc2U6IHtcbiAgICAgIHZhbHVlOiAoKSA9PiB7XG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmV0IGFzIFBMaW1pdDtcbn1cblxuaW50ZXJmYWNlIFBMaW1pdCB7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbiAgPEE+KHByb21pc2VGYWN0b3J5OiBQcm9taXNlRmFjdG9yeTxBPik6IFByb21pc2U8QT47XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IAws } from '../aws';
|
|
2
|
+
/**
|
|
3
|
+
* Replace the {ACCOUNT} and {REGION} placeholders in all strings found in a complex object.
|
|
4
|
+
*
|
|
5
|
+
* Duplicated between cdk-assets and aws-cdk CLI because we don't have a good single place to put it
|
|
6
|
+
* (they're nominally independent tools).
|
|
7
|
+
*/
|
|
8
|
+
export declare function replaceAwsPlaceholders<A extends {
|
|
9
|
+
region?: string;
|
|
10
|
+
}>(object: A, aws: IAws): Promise<A>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.replaceAwsPlaceholders = replaceAwsPlaceholders;
|
|
4
|
+
const cx_api_1 = require("@aws-cdk/cx-api");
|
|
5
|
+
/**
|
|
6
|
+
* Replace the {ACCOUNT} and {REGION} placeholders in all strings found in a complex object.
|
|
7
|
+
*
|
|
8
|
+
* Duplicated between cdk-assets and aws-cdk CLI because we don't have a good single place to put it
|
|
9
|
+
* (they're nominally independent tools).
|
|
10
|
+
*/
|
|
11
|
+
async function replaceAwsPlaceholders(object, aws) {
|
|
12
|
+
let partition = async () => {
|
|
13
|
+
const p = await aws.discoverPartition();
|
|
14
|
+
partition = () => Promise.resolve(p);
|
|
15
|
+
return p;
|
|
16
|
+
};
|
|
17
|
+
let account = async () => {
|
|
18
|
+
const a = await aws.discoverCurrentAccount();
|
|
19
|
+
account = () => Promise.resolve(a);
|
|
20
|
+
return a;
|
|
21
|
+
};
|
|
22
|
+
return cx_api_1.EnvironmentPlaceholders.replaceAsync(object, {
|
|
23
|
+
async region() {
|
|
24
|
+
return object.region ?? aws.discoverDefaultRegion();
|
|
25
|
+
},
|
|
26
|
+
async accountId() {
|
|
27
|
+
return (await account()).accountId;
|
|
28
|
+
},
|
|
29
|
+
async partition() {
|
|
30
|
+
return partition();
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGxhY2Vob2xkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esd0RBMkJDO0FBcENELDRDQUEwRDtBQUcxRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsTUFBUyxFQUNULEdBQVM7SUFFVCxJQUFJLFNBQVMsR0FBRyxLQUFLLElBQUksRUFBRTtRQUN6QixNQUFNLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDO0lBRUYsSUFBSSxPQUFPLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDdkIsTUFBTSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUMsQ0FBQztJQUVGLE9BQU8sZ0NBQXVCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtRQUNsRCxLQUFLLENBQUMsTUFBTTtZQUNWLE9BQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFNBQVM7WUFDYixPQUFPLENBQUMsTUFBTSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsS0FBSyxDQUFDLFNBQVM7WUFDYixPQUFPLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQbGFjZWhvbGRlcnMgfSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgSUF3cyB9IGZyb20gJy4uL2F3cyc7XG5cbi8qKlxuICogUmVwbGFjZSB0aGUge0FDQ09VTlR9IGFuZCB7UkVHSU9OfSBwbGFjZWhvbGRlcnMgaW4gYWxsIHN0cmluZ3MgZm91bmQgaW4gYSBjb21wbGV4IG9iamVjdC5cbiAqXG4gKiBEdXBsaWNhdGVkIGJldHdlZW4gY2RrLWFzc2V0cyBhbmQgYXdzLWNkayBDTEkgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgZ29vZCBzaW5nbGUgcGxhY2UgdG8gcHV0IGl0XG4gKiAodGhleSdyZSBub21pbmFsbHkgaW5kZXBlbmRlbnQgdG9vbHMpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUF3c1BsYWNlaG9sZGVyczxBIGV4dGVuZHMgeyByZWdpb24/OiBzdHJpbmcgfT4oXG4gIG9iamVjdDogQSxcbiAgYXdzOiBJQXdzLFxuKTogUHJvbWlzZTxBPiB7XG4gIGxldCBwYXJ0aXRpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcCA9IGF3YWl0IGF3cy5kaXNjb3ZlclBhcnRpdGlvbigpO1xuICAgIHBhcnRpdGlvbiA9ICgpID0+IFByb21pc2UucmVzb2x2ZShwKTtcbiAgICByZXR1cm4gcDtcbiAgfTtcblxuICBsZXQgYWNjb3VudCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gYXdhaXQgYXdzLmRpc2NvdmVyQ3VycmVudEFjY291bnQoKTtcbiAgICBhY2NvdW50ID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGEpO1xuICAgIHJldHVybiBhO1xuICB9O1xuXG4gIHJldHVybiBFbnZpcm9ubWVudFBsYWNlaG9sZGVycy5yZXBsYWNlQXN5bmMob2JqZWN0LCB7XG4gICAgYXN5bmMgcmVnaW9uKCkge1xuICAgICAgcmV0dXJuIG9iamVjdC5yZWdpb24gPz8gYXdzLmRpc2NvdmVyRGVmYXVsdFJlZ2lvbigpO1xuICAgIH0sXG4gICAgYXN5bmMgYWNjb3VudElkKCkge1xuICAgICAgcmV0dXJuIChhd2FpdCBhY2NvdW50KCkpLmFjY291bnRJZDtcbiAgICB9LFxuICAgIGFzeW5jIHBhcnRpdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXJ0aXRpb24oKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as child_process from 'child_process';
|
|
2
|
+
import { SubprocessOutputDestination } from './asset-handler';
|
|
3
|
+
export type ShellEventType = 'open' | 'data_stdout' | 'data_stderr' | 'close';
|
|
4
|
+
export type ShellEventPublisher = (event: ShellEventType, message: string) => void;
|
|
5
|
+
export interface ShellOptions extends child_process.SpawnOptions {
|
|
6
|
+
readonly shellEventPublisher: ShellEventPublisher;
|
|
7
|
+
readonly input?: string;
|
|
8
|
+
readonly subprocessOutputDestination?: SubprocessOutputDestination;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* OS helpers
|
|
12
|
+
*
|
|
13
|
+
* Shell function which both prints to stdout and collects the output into a
|
|
14
|
+
* string.
|
|
15
|
+
*/
|
|
16
|
+
export declare function shell(command: string[], options: ShellOptions): Promise<string>;
|
|
17
|
+
export type ProcessFailedError = ProcessFailed;
|
|
18
|
+
declare class ProcessFailed extends Error {
|
|
19
|
+
readonly exitCode: number | null;
|
|
20
|
+
readonly signal: NodeJS.Signals | null;
|
|
21
|
+
readonly code = "PROCESS_FAILED";
|
|
22
|
+
constructor(exitCode: number | null, signal: NodeJS.Signals | null, message: string);
|
|
23
|
+
}
|
|
24
|
+
export {};
|