@capraconsulting/webapp-deploy-lambda 2.2.5 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/package.json +18 -16
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -8
- package/lib/source.d.ts +0 -58
- package/lib/source.js +0 -69
- package/lib/webapp-deploy.d.ts +0 -64
- package/lib/webapp-deploy.js +0 -68
package/README.md
CHANGED
|
@@ -8,14 +8,14 @@ threshold.
|
|
|
8
8
|
What it does:
|
|
9
9
|
|
|
10
10
|
1. Fetch deployment log from S3
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
2. Fetch bundled artifact and extract locally with optional filtering
|
|
12
|
+
3. Upload all non-html files to S3
|
|
13
|
+
4. Upload html files to S3
|
|
14
|
+
5. Add uploaded items to deployment log
|
|
15
|
+
6. Delete old items from S3
|
|
16
|
+
7. Prune old deployments from deployment log
|
|
17
|
+
8. Store deployment log to S3 for next run
|
|
18
|
+
9. Optionally invalidate CloudFront distribution
|
|
19
19
|
|
|
20
20
|
## Preserving old files
|
|
21
21
|
|
|
@@ -44,7 +44,7 @@ aws lambda invoke \
|
|
|
44
44
|
--payload '{
|
|
45
45
|
"ResourceProperties": {
|
|
46
46
|
"artifactS3Url": "s3://my-bucket/my-release.tgz"
|
|
47
|
-
},
|
|
47
|
+
},
|
|
48
48
|
"RequestType": "Update"
|
|
49
49
|
}' \
|
|
50
50
|
/tmp/out.log
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@capraconsulting/webapp-deploy-lambda",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "CDK construct for deploying a webapp release to S3 and CloudFront",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"repository": {
|
|
6
7
|
"type": "git",
|
|
7
8
|
"url": "https://github.com/capralifecycle/webapp-deploy-lambda"
|
|
@@ -39,26 +40,27 @@
|
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
42
|
"@aws-cdk/assert": "2.68.0",
|
|
42
|
-
"@commitlint/cli": "19.
|
|
43
|
-
"@commitlint/config-conventional": "19.
|
|
44
|
-
"@
|
|
45
|
-
"@
|
|
46
|
-
"@
|
|
47
|
-
"@
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
43
|
+
"@commitlint/cli": "19.6.0",
|
|
44
|
+
"@commitlint/config-conventional": "19.6.0",
|
|
45
|
+
"@eslint/eslintrc": "3.2.0",
|
|
46
|
+
"@eslint/js": "9.16.0",
|
|
47
|
+
"@types/jest": "29.5.14",
|
|
48
|
+
"@types/node": "22.10.2",
|
|
49
|
+
"@typescript-eslint/eslint-plugin": "8.18.0",
|
|
50
|
+
"@typescript-eslint/parser": "8.18.0",
|
|
51
|
+
"aws-cdk-lib": "2.173.0",
|
|
52
|
+
"constructs": "10.4.2",
|
|
53
|
+
"eslint": "9.16.0",
|
|
51
54
|
"eslint-config-prettier": "9.1.0",
|
|
52
|
-
"eslint-plugin-deprecation": "3.0.0",
|
|
53
55
|
"eslint-plugin-prettier": "5.2.1",
|
|
54
|
-
"husky": "9.1.
|
|
56
|
+
"husky": "9.1.7",
|
|
55
57
|
"jest": "29.7.0",
|
|
56
58
|
"jest-cdk-snapshot": "2.2.5",
|
|
57
|
-
"prettier": "3.
|
|
58
|
-
"semantic-release": "24.
|
|
59
|
+
"prettier": "3.4.2",
|
|
60
|
+
"semantic-release": "24.2.0",
|
|
59
61
|
"ts-jest": "29.2.5",
|
|
60
|
-
"
|
|
61
|
-
"typescript": "5.
|
|
62
|
+
"tsx": "4.19.2",
|
|
63
|
+
"typescript": "5.7.2"
|
|
62
64
|
},
|
|
63
65
|
"peerDependencies": {
|
|
64
66
|
"aws-cdk-lib": "^2.0.0",
|
package/lib/index.d.ts
DELETED
package/lib/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebappDeploy = exports.Source = void 0;
|
|
4
|
-
var source_1 = require("./source");
|
|
5
|
-
Object.defineProperty(exports, "Source", { enumerable: true, get: function () { return source_1.Source; } });
|
|
6
|
-
var webapp_deploy_1 = require("./webapp-deploy");
|
|
7
|
-
Object.defineProperty(exports, "WebappDeploy", { enumerable: true, get: function () { return webapp_deploy_1.WebappDeploy; } });
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXdEO0FBQXRDLGdHQUFBLE1BQU0sT0FBQTtBQUN4QixpREFBaUU7QUFBeEQsNkdBQUEsWUFBWSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgSVNvdXJjZSwgU291cmNlLCBTb3VyY2VDb25maWcgfSBmcm9tIFwiLi9zb3VyY2VcIlxuZXhwb3J0IHsgV2ViYXBwRGVwbG95LCBXZWJhcHBEZXBsb3lQcm9wcyB9IGZyb20gXCIuL3dlYmFwcC1kZXBsb3lcIlxuIl19
|
package/lib/source.d.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import * as constructs from "constructs";
|
|
2
|
-
import * as iam from "aws-cdk-lib/aws-iam";
|
|
3
|
-
import * as s3 from "aws-cdk-lib/aws-s3";
|
|
4
|
-
import * as s3Assets from "aws-cdk-lib/aws-s3-assets";
|
|
5
|
-
export interface SourceConfig {
|
|
6
|
-
/**
|
|
7
|
-
* The source bucket to deploy from.
|
|
8
|
-
*/
|
|
9
|
-
readonly bucket: s3.IBucket;
|
|
10
|
-
/**
|
|
11
|
-
* An S3 object key in the source bucket that points to a zip file.
|
|
12
|
-
*/
|
|
13
|
-
readonly zipObjectKey: string;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Bind context for ISources
|
|
17
|
-
*/
|
|
18
|
-
export interface SourceContext {
|
|
19
|
-
/**
|
|
20
|
-
* The role for the handler
|
|
21
|
-
*
|
|
22
|
-
* @default - no policy is modified
|
|
23
|
-
*/
|
|
24
|
-
readonly handlerRole?: iam.IRole;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Represents a source for bucket deployments.
|
|
28
|
-
*/
|
|
29
|
-
export interface ISource {
|
|
30
|
-
/**
|
|
31
|
-
* Binds the source to a bucket deployment.
|
|
32
|
-
*/
|
|
33
|
-
bind(scope: constructs.Construct, context?: SourceContext): SourceConfig;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Specifies bucket deployment source.
|
|
37
|
-
*
|
|
38
|
-
* Usage:
|
|
39
|
-
*
|
|
40
|
-
* Source.bucket(bucket, key)
|
|
41
|
-
* Source.asset('/local/path/to/directory')
|
|
42
|
-
* Source.asset('/local/path/to/a/file.zip')
|
|
43
|
-
*
|
|
44
|
-
*/
|
|
45
|
-
export declare class Source {
|
|
46
|
-
/**
|
|
47
|
-
* Uses a .zip file stored in an S3 bucket as the source for the destination bucket contents.
|
|
48
|
-
* @param bucket The S3 Bucket
|
|
49
|
-
* @param zipObjectKey The S3 object key of the zip file with contents
|
|
50
|
-
*/
|
|
51
|
-
static bucket(bucket: s3.IBucket, zipObjectKey: string): ISource;
|
|
52
|
-
/**
|
|
53
|
-
* Uses a local asset as the deployment source.
|
|
54
|
-
* @param path The path to a local .zip file or a directory
|
|
55
|
-
*/
|
|
56
|
-
static asset(path: string, options?: s3Assets.AssetOptions): ISource;
|
|
57
|
-
private constructor();
|
|
58
|
-
}
|
package/lib/source.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Source = void 0;
|
|
4
|
-
const s3Assets = require("aws-cdk-lib/aws-s3-assets");
|
|
5
|
-
/**
|
|
6
|
-
* Specifies bucket deployment source.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
*
|
|
10
|
-
* Source.bucket(bucket, key)
|
|
11
|
-
* Source.asset('/local/path/to/directory')
|
|
12
|
-
* Source.asset('/local/path/to/a/file.zip')
|
|
13
|
-
*
|
|
14
|
-
*/
|
|
15
|
-
class Source {
|
|
16
|
-
/**
|
|
17
|
-
* Uses a .zip file stored in an S3 bucket as the source for the destination bucket contents.
|
|
18
|
-
* @param bucket The S3 Bucket
|
|
19
|
-
* @param zipObjectKey The S3 object key of the zip file with contents
|
|
20
|
-
*/
|
|
21
|
-
static bucket(bucket, zipObjectKey) {
|
|
22
|
-
return {
|
|
23
|
-
bind: (_, context) => {
|
|
24
|
-
if (!context) {
|
|
25
|
-
throw new Error("To use a Source.bucket(), context must be provided");
|
|
26
|
-
}
|
|
27
|
-
if (context.handlerRole) {
|
|
28
|
-
bucket.grantRead(context.handlerRole);
|
|
29
|
-
}
|
|
30
|
-
return { bucket, zipObjectKey };
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Uses a local asset as the deployment source.
|
|
36
|
-
* @param path The path to a local .zip file or a directory
|
|
37
|
-
*/
|
|
38
|
-
static asset(path, options) {
|
|
39
|
-
return {
|
|
40
|
-
bind(scope, context) {
|
|
41
|
-
if (!context) {
|
|
42
|
-
throw new Error("To use a Source.asset(), context must be provided");
|
|
43
|
-
}
|
|
44
|
-
let id = 1;
|
|
45
|
-
while (scope.node.tryFindChild(`Asset${id}`)) {
|
|
46
|
-
id++;
|
|
47
|
-
}
|
|
48
|
-
const asset = new s3Assets.Asset(scope, `Asset${id}`, {
|
|
49
|
-
path,
|
|
50
|
-
...options,
|
|
51
|
-
});
|
|
52
|
-
if (!asset.isZipArchive) {
|
|
53
|
-
throw new Error("Asset path must be either a .zip file or a directory");
|
|
54
|
-
}
|
|
55
|
-
if (context.handlerRole) {
|
|
56
|
-
asset.grantRead(context.handlerRole);
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
bucket: asset.bucket,
|
|
60
|
-
zipObjectKey: asset.s3ObjectKey,
|
|
61
|
-
};
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
66
|
-
constructor() { }
|
|
67
|
-
}
|
|
68
|
-
exports.Source = Source;
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxzREFBcUQ7QUFzQ3JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsTUFBTTtJQUNqQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFrQixFQUFFLFlBQW9CO1FBQzNELE9BQU87WUFDTCxJQUFJLEVBQUUsQ0FBQyxDQUF1QixFQUFFLE9BQXVCLEVBQUUsRUFBRTtnQkFDekQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtnQkFDdkUsQ0FBQztnQkFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3ZDLENBQUM7Z0JBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQTtZQUNqQyxDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQVksRUFBRSxPQUErQjtRQUMvRCxPQUFPO1lBQ0wsSUFBSSxDQUFDLEtBQTJCLEVBQUUsT0FBdUI7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7Z0JBQ3RFLENBQUM7Z0JBRUQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUNWLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLEVBQUUsRUFBRSxDQUFBO2dCQUNOLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO29CQUNwRCxJQUFJO29CQUNKLEdBQUcsT0FBTztpQkFDWCxDQUFDLENBQUE7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYixzREFBc0QsQ0FDdkQsQ0FBQTtnQkFDSCxDQUFDO2dCQUVELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtnQkFDdEMsQ0FBQztnQkFFRCxPQUFPO29CQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxXQUFXO2lCQUNoQyxDQUFBO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLGdCQUF1QixDQUFDO0NBQ3pCO0FBN0RELHdCQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgczNBc3NldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1hc3NldHNcIlxuXG4vLyBUaGlzIGlzIG1vc3RseSBiYXNlZCBvbiBhd3MtczMtZGVwbG95bWVudCBmcm9tIGF3cy1jZGsuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgYnVja2V0IHRvIGRlcGxveSBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0XG5cbiAgLyoqXG4gICAqIEFuIFMzIG9iamVjdCBrZXkgaW4gdGhlIHNvdXJjZSBidWNrZXQgdGhhdCBwb2ludHMgdG8gYSB6aXAgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHppcE9iamVjdEtleTogc3RyaW5nXG59XG5cbi8qKlxuICogQmluZCBjb250ZXh0IGZvciBJU291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUNvbnRleHQge1xuICAvKipcbiAgICogVGhlIHJvbGUgZm9yIHRoZSBoYW5kbGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcG9saWN5IGlzIG1vZGlmaWVkXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyUm9sZT86IGlhbS5JUm9sZVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzb3VyY2UgZm9yIGJ1Y2tldCBkZXBsb3ltZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU291cmNlIHtcbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBzb3VyY2UgdG8gYSBidWNrZXQgZGVwbG95bWVudC5cbiAgICovXG4gIGJpbmQoc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBjb250ZXh0PzogU291cmNlQ29udGV4dCk6IFNvdXJjZUNvbmZpZ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBidWNrZXQgZGVwbG95bWVudCBzb3VyY2UuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAgIFNvdXJjZS5idWNrZXQoYnVja2V0LCBrZXkpXG4gKiAgICAgU291cmNlLmFzc2V0KCcvbG9jYWwvcGF0aC90by9kaXJlY3RvcnknKVxuICogICAgIFNvdXJjZS5hc3NldCgnL2xvY2FsL3BhdGgvdG8vYS9maWxlLnppcCcpXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU291cmNlIHtcbiAgLyoqXG4gICAqIFVzZXMgYSAuemlwIGZpbGUgc3RvcmVkIGluIGFuIFMzIGJ1Y2tldCBhcyB0aGUgc291cmNlIGZvciB0aGUgZGVzdGluYXRpb24gYnVja2V0IGNvbnRlbnRzLlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBCdWNrZXRcbiAgICogQHBhcmFtIHppcE9iamVjdEtleSBUaGUgUzMgb2JqZWN0IGtleSBvZiB0aGUgemlwIGZpbGUgd2l0aCBjb250ZW50c1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWNrZXQoYnVja2V0OiBzMy5JQnVja2V0LCB6aXBPYmplY3RLZXk6IHN0cmluZyk6IElTb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kOiAoXzogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGNvbnRleHQ/OiBTb3VyY2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRvIHVzZSBhIFNvdXJjZS5idWNrZXQoKSwgY29udGV4dCBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5oYW5kbGVyUm9sZSkge1xuICAgICAgICAgIGJ1Y2tldC5ncmFudFJlYWQoY29udGV4dC5oYW5kbGVyUm9sZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJ1Y2tldCwgemlwT2JqZWN0S2V5IH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYSBsb2NhbCBhc3NldCBhcyB0aGUgZGVwbG95bWVudCBzb3VyY2UuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGEgbG9jYWwgLnppcCBmaWxlIG9yIGEgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzc2V0KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHMzQXNzZXRzLkFzc2V0T3B0aW9ucyk6IElTb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgY29udGV4dD86IFNvdXJjZUNvbnRleHQpOiBTb3VyY2VDb25maWcge1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUbyB1c2UgYSBTb3VyY2UuYXNzZXQoKSwgY29udGV4dCBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaWQgPSAxXG4gICAgICAgIHdoaWxlIChzY29wZS5ub2RlLnRyeUZpbmRDaGlsZChgQXNzZXQke2lkfWApKSB7XG4gICAgICAgICAgaWQrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2V0ID0gbmV3IHMzQXNzZXRzLkFzc2V0KHNjb3BlLCBgQXNzZXQke2lkfWAsIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgICAgIGlmICghYXNzZXQuaXNaaXBBcmNoaXZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJBc3NldCBwYXRoIG11c3QgYmUgZWl0aGVyIGEgLnppcCBmaWxlIG9yIGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQuaGFuZGxlclJvbGUpIHtcbiAgICAgICAgICBhc3NldC5ncmFudFJlYWQoY29udGV4dC5oYW5kbGVyUm9sZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVja2V0OiBhc3NldC5idWNrZXQsXG4gICAgICAgICAgemlwT2JqZWN0S2V5OiBhc3NldC5zM09iamVjdEtleSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
|
package/lib/webapp-deploy.d.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import * as constructs from "constructs";
|
|
2
|
-
import * as cloudfront from "aws-cdk-lib/aws-cloudfront";
|
|
3
|
-
import * as lambda from "aws-cdk-lib/aws-lambda";
|
|
4
|
-
import * as s3 from "aws-cdk-lib/aws-s3";
|
|
5
|
-
import * as cdk from "aws-cdk-lib";
|
|
6
|
-
import { ISource } from "./source";
|
|
7
|
-
export interface WebappDeployProps {
|
|
8
|
-
/**
|
|
9
|
-
* Optional S3 bucket that can be used for deployment from outside CDK.
|
|
10
|
-
*
|
|
11
|
-
* If specified a policy is added so the deploy function can read from
|
|
12
|
-
* the bucket.
|
|
13
|
-
*
|
|
14
|
-
* @default - none
|
|
15
|
-
*/
|
|
16
|
-
buildsBucket?: s3.IBucket;
|
|
17
|
-
/**
|
|
18
|
-
* CloudFront Distribution to be invalidated after deploy.
|
|
19
|
-
*
|
|
20
|
-
* @default - none
|
|
21
|
-
*/
|
|
22
|
-
distribution?: cloudfront.IDistribution;
|
|
23
|
-
/**
|
|
24
|
-
* Regex for patterns of files to be discarded during deployment.
|
|
25
|
-
*
|
|
26
|
-
* Example: `\.map$` will exclude `js/myapp-1b22c248f.js.map`.
|
|
27
|
-
*
|
|
28
|
-
* @default - none
|
|
29
|
-
*/
|
|
30
|
-
excludePattern?: string;
|
|
31
|
-
/**
|
|
32
|
-
* The time when a deployment is considered old and will be deleted
|
|
33
|
-
* unless it is the newest old deployment.
|
|
34
|
-
*
|
|
35
|
-
* @default - 5 days
|
|
36
|
-
*/
|
|
37
|
-
pruneDeploymentsOlderThan?: cdk.Duration;
|
|
38
|
-
/**
|
|
39
|
-
* Name of the lambda function to be created.
|
|
40
|
-
*
|
|
41
|
-
* @default cdk.PhysicalName.GENERATE_IF_NEEDED
|
|
42
|
-
*/
|
|
43
|
-
functionName?: string;
|
|
44
|
-
/**
|
|
45
|
-
* Name of S3 bucket where the contents of the artifacts will be deployed.
|
|
46
|
-
* The files will be deployed under the key "web", which is then expected
|
|
47
|
-
* to be the origin for the CloudFront distribution
|
|
48
|
-
*/
|
|
49
|
-
webBucket: s3.IBucket;
|
|
50
|
-
/**
|
|
51
|
-
* Specific artifact to be deployed to the bucket during CDK deployment.
|
|
52
|
-
*
|
|
53
|
-
* @default - none
|
|
54
|
-
*/
|
|
55
|
-
source?: ISource;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Resource to deploy a webapp from a build artifact into an existing
|
|
59
|
-
* S3 Bucket and CloudFront Distribution.
|
|
60
|
-
*/
|
|
61
|
-
export declare class WebappDeploy extends constructs.Construct {
|
|
62
|
-
readonly deployFn: lambda.Function;
|
|
63
|
-
constructor(scope: constructs.Construct, id: string, props: WebappDeployProps);
|
|
64
|
-
}
|
package/lib/webapp-deploy.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebappDeploy = void 0;
|
|
4
|
-
const constructs = require("constructs");
|
|
5
|
-
const iam = require("aws-cdk-lib/aws-iam");
|
|
6
|
-
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
7
|
-
const cdk = require("aws-cdk-lib");
|
|
8
|
-
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
9
|
-
const path = require("path");
|
|
10
|
-
/**
|
|
11
|
-
* Resource to deploy a webapp from a build artifact into an existing
|
|
12
|
-
* S3 Bucket and CloudFront Distribution.
|
|
13
|
-
*/
|
|
14
|
-
class WebappDeploy extends constructs.Construct {
|
|
15
|
-
constructor(scope, id, props) {
|
|
16
|
-
var _a, _b;
|
|
17
|
-
super(scope, id);
|
|
18
|
-
const environment = {
|
|
19
|
-
DEPLOY_LOG_BUCKET_URL: `s3://${props.webBucket.bucketName}/deployments.log`,
|
|
20
|
-
EXPIRE_SECONDS: ((_a = props.pruneDeploymentsOlderThan) !== null && _a !== void 0 ? _a : cdk.Duration.days(5))
|
|
21
|
-
.toSeconds()
|
|
22
|
-
.toString(),
|
|
23
|
-
TARGET_BUCKET_URL: `s3://${props.webBucket.bucketName}/web`,
|
|
24
|
-
};
|
|
25
|
-
if (props.distribution != null) {
|
|
26
|
-
environment.CF_DISTRIBUTION_ID = props.distribution.distributionId;
|
|
27
|
-
}
|
|
28
|
-
if (props.excludePattern != null) {
|
|
29
|
-
environment.EXCLUDE_PATTERN = props.excludePattern;
|
|
30
|
-
}
|
|
31
|
-
this.deployFn = new lambda.Function(this, "WebappDeployResource", {
|
|
32
|
-
code: lambda.Code.fromAsset(path.join(__dirname, "../dist")),
|
|
33
|
-
environment,
|
|
34
|
-
functionName: (_b = props.functionName) !== null && _b !== void 0 ? _b : cdk.PhysicalName.GENERATE_IF_NEEDED,
|
|
35
|
-
handler: "webapp_deploy.main.handler",
|
|
36
|
-
reservedConcurrentExecutions: 1,
|
|
37
|
-
runtime: lambda.Runtime.PYTHON_3_12,
|
|
38
|
-
timeout: cdk.Duration.minutes(2),
|
|
39
|
-
initialPolicy: [
|
|
40
|
-
new iam.PolicyStatement({
|
|
41
|
-
actions: ["cloudfront:CreateInvalidation"],
|
|
42
|
-
// Cannot be restricted
|
|
43
|
-
resources: ["*"],
|
|
44
|
-
}),
|
|
45
|
-
],
|
|
46
|
-
});
|
|
47
|
-
const provider = new custom_resources_1.Provider(this, "Provider", {
|
|
48
|
-
onEventHandler: this.deployFn,
|
|
49
|
-
});
|
|
50
|
-
props.webBucket.grantReadWrite(this.deployFn);
|
|
51
|
-
if (props.buildsBucket) {
|
|
52
|
-
props.buildsBucket.grantRead(this.deployFn);
|
|
53
|
-
}
|
|
54
|
-
if (props.source) {
|
|
55
|
-
const source = props.source.bind(this, {
|
|
56
|
-
handlerRole: this.deployFn.role,
|
|
57
|
-
});
|
|
58
|
-
new cdk.CustomResource(this, "CustomResource", {
|
|
59
|
-
serviceToken: provider.serviceToken,
|
|
60
|
-
properties: {
|
|
61
|
-
artifactS3Url: `s3://${source.bucket.bucketName}/${source.zipObjectKey}`,
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
exports.WebappDeploy = WebappDeploy;
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwLWRlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJhcHAtZGVwbG95LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QywyQ0FBMEM7QUFDMUMsaURBQWdEO0FBRWhELG1DQUFrQztBQUNsQyxtRUFBdUQ7QUFDdkQsNkJBQTRCO0FBc0Q1Qjs7O0dBR0c7QUFDSCxNQUFhLFlBQWEsU0FBUSxVQUFVLENBQUMsU0FBUztJQUdwRCxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUF3Qjs7UUFFeEIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLFdBQVcsR0FBMkI7WUFDMUMscUJBQXFCLEVBQUUsUUFBUSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsa0JBQWtCO1lBQzNFLGNBQWMsRUFBRSxDQUFDLE1BQUEsS0FBSyxDQUFDLHlCQUF5QixtQ0FBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdEUsU0FBUyxFQUFFO2lCQUNYLFFBQVEsRUFBRTtZQUNiLGlCQUFpQixFQUFFLFFBQVEsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLE1BQU07U0FDNUQsQ0FBQTtRQUVELElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixXQUFXLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUE7UUFDcEUsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxXQUFXLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUE7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUNoRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUQsV0FBVztZQUNYLFlBQVksRUFBRSxNQUFBLEtBQUssQ0FBQyxZQUFZLG1DQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsa0JBQWtCO1lBQ3ZFLE9BQU8sRUFBRSw0QkFBNEI7WUFDckMsNEJBQTRCLEVBQUUsQ0FBQztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEMsYUFBYSxFQUFFO2dCQUNiLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztvQkFDdEIsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUM7b0JBQzFDLHVCQUF1QjtvQkFDdkIsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUE7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLDJCQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM5QyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDOUIsQ0FBQyxDQUFBO1FBRUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTdDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFLO2FBQ2pDLENBQUMsQ0FBQTtZQUNGLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtnQkFDbkMsVUFBVSxFQUFFO29CQUNWLGFBQWEsRUFBRSxRQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7aUJBQ3pFO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpFRCxvQ0FpRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBJU291cmNlIH0gZnJvbSBcIi4vc291cmNlXCJcblxuZXhwb3J0IGludGVyZmFjZSBXZWJhcHBEZXBsb3lQcm9wcyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBTMyBidWNrZXQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVwbG95bWVudCBmcm9tIG91dHNpZGUgQ0RLLlxuICAgKlxuICAgKiBJZiBzcGVjaWZpZWQgYSBwb2xpY3kgaXMgYWRkZWQgc28gdGhlIGRlcGxveSBmdW5jdGlvbiBjYW4gcmVhZCBmcm9tXG4gICAqIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgYnVpbGRzQnVja2V0PzogczMuSUJ1Y2tldFxuICAvKipcbiAgICogQ2xvdWRGcm9udCBEaXN0cmlidXRpb24gdG8gYmUgaW52YWxpZGF0ZWQgYWZ0ZXIgZGVwbG95LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIGRpc3RyaWJ1dGlvbj86IGNsb3VkZnJvbnQuSURpc3RyaWJ1dGlvblxuICAvKipcbiAgICogUmVnZXggZm9yIHBhdHRlcm5zIG9mIGZpbGVzIHRvIGJlIGRpc2NhcmRlZCBkdXJpbmcgZGVwbG95bWVudC5cbiAgICpcbiAgICogRXhhbXBsZTogYFxcLm1hcCRgIHdpbGwgZXhjbHVkZSBganMvbXlhcHAtMWIyMmMyNDhmLmpzLm1hcGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgZXhjbHVkZVBhdHRlcm4/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSB0aW1lIHdoZW4gYSBkZXBsb3ltZW50IGlzIGNvbnNpZGVyZWQgb2xkIGFuZCB3aWxsIGJlIGRlbGV0ZWRcbiAgICogdW5sZXNzIGl0IGlzIHRoZSBuZXdlc3Qgb2xkIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNSBkYXlzXG4gICAqL1xuICBwcnVuZURlcGxveW1lbnRzT2xkZXJUaGFuPzogY2RrLkR1cmF0aW9uXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBsYW1iZGEgZnVuY3Rpb24gdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgY2RrLlBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERURcbiAgICovXG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogTmFtZSBvZiBTMyBidWNrZXQgd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcnRpZmFjdHMgd2lsbCBiZSBkZXBsb3llZC5cbiAgICogVGhlIGZpbGVzIHdpbGwgYmUgZGVwbG95ZWQgdW5kZXIgdGhlIGtleSBcIndlYlwiLCB3aGljaCBpcyB0aGVuIGV4cGVjdGVkXG4gICAqIHRvIGJlIHRoZSBvcmlnaW4gZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvblxuICAgKi9cbiAgd2ViQnVja2V0OiBzMy5JQnVja2V0XG4gIC8qKlxuICAgKiBTcGVjaWZpYyBhcnRpZmFjdCB0byBiZSBkZXBsb3llZCB0byB0aGUgYnVja2V0IGR1cmluZyBDREsgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICBzb3VyY2U/OiBJU291cmNlXG59XG5cbi8qKlxuICogUmVzb3VyY2UgdG8gZGVwbG95IGEgd2ViYXBwIGZyb20gYSBidWlsZCBhcnRpZmFjdCBpbnRvIGFuIGV4aXN0aW5nXG4gKiBTMyBCdWNrZXQgYW5kIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgV2ViYXBwRGVwbG95IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICByZWFkb25seSBkZXBsb3lGbjogbGFtYmRhLkZ1bmN0aW9uXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFdlYmFwcERlcGxveVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIERFUExPWV9MT0dfQlVDS0VUX1VSTDogYHMzOi8vJHtwcm9wcy53ZWJCdWNrZXQuYnVja2V0TmFtZX0vZGVwbG95bWVudHMubG9nYCxcbiAgICAgIEVYUElSRV9TRUNPTkRTOiAocHJvcHMucHJ1bmVEZXBsb3ltZW50c09sZGVyVGhhbiA/PyBjZGsuRHVyYXRpb24uZGF5cyg1KSlcbiAgICAgICAgLnRvU2Vjb25kcygpXG4gICAgICAgIC50b1N0cmluZygpLFxuICAgICAgVEFSR0VUX0JVQ0tFVF9VUkw6IGBzMzovLyR7cHJvcHMud2ViQnVja2V0LmJ1Y2tldE5hbWV9L3dlYmAsXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRpc3RyaWJ1dGlvbiAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5DRl9ESVNUUklCVVRJT05fSUQgPSBwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWRcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZXhjbHVkZVBhdHRlcm4gIT0gbnVsbCkge1xuICAgICAgZW52aXJvbm1lbnQuRVhDTFVERV9QQVRURVJOID0gcHJvcHMuZXhjbHVkZVBhdHRlcm5cbiAgICB9XG5cbiAgICB0aGlzLmRlcGxveUZuID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCBcIldlYmFwcERlcGxveVJlc291cmNlXCIsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL2Rpc3RcIikpLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLmZ1bmN0aW9uTmFtZSA/PyBjZGsuUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGhhbmRsZXI6IFwid2ViYXBwX2RlcGxveS5tYWluLmhhbmRsZXJcIixcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IDEsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMixcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDIpLFxuICAgICAgaW5pdGlhbFBvbGljeTogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1wiY2xvdWRmcm9udDpDcmVhdGVJbnZhbGlkYXRpb25cIl0sXG4gICAgICAgICAgLy8gQ2Fubm90IGJlIHJlc3RyaWN0ZWRcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgXCJQcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogdGhpcy5kZXBsb3lGbixcbiAgICB9KVxuXG4gICAgcHJvcHMud2ViQnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuZGVwbG95Rm4pXG5cbiAgICBpZiAocHJvcHMuYnVpbGRzQnVja2V0KSB7XG4gICAgICBwcm9wcy5idWlsZHNCdWNrZXQuZ3JhbnRSZWFkKHRoaXMuZGVwbG95Rm4pXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNvdXJjZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gcHJvcHMuc291cmNlLmJpbmQodGhpcywge1xuICAgICAgICBoYW5kbGVyUm9sZTogdGhpcy5kZXBsb3lGbi5yb2xlISxcbiAgICAgIH0pXG4gICAgICBuZXcgY2RrLkN1c3RvbVJlc291cmNlKHRoaXMsIFwiQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGFydGlmYWN0UzNVcmw6IGBzMzovLyR7c291cmNlLmJ1Y2tldC5idWNrZXROYW1lfS8ke3NvdXJjZS56aXBPYmplY3RLZXl9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iXX0=
|