@liflig/cdk 2.18.5 → 2.18.7

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.
Files changed (140) hide show
  1. package/assets/cloudtrail-slack-integration-lambda/main.py +267 -0
  2. package/assets/pipeline-slack-notification-lambda/index.py +300 -0
  3. package/assets/prepare-cdk-source-lambda/index.py +159 -0
  4. package/assets/slack-alarm-lambda/index.py +103 -0
  5. package/lib/alarms/database-alarms.d.ts +125 -0
  6. package/lib/alarms/database-alarms.js +171 -0
  7. package/lib/alarms/index.d.ts +3 -0
  8. package/lib/alarms/index.js +10 -0
  9. package/lib/alarms/service-alarms.d.ts +145 -0
  10. package/lib/alarms/service-alarms.js +148 -0
  11. package/lib/alarms/ses-alarms.d.ts +67 -0
  12. package/lib/alarms/ses-alarms.js +49 -0
  13. package/lib/alarms/slack-alarm.d.ts +25 -0
  14. package/lib/alarms/slack-alarm.js +47 -0
  15. package/lib/bastion-host.d.ts +41 -0
  16. package/lib/bastion-host.js +86 -0
  17. package/lib/bin/cdk-create-snapshots.d.ts +2 -0
  18. package/lib/bin/fetch-pipeline-variables.d.ts +2 -0
  19. package/lib/build-artifacts/index.d.ts +68 -0
  20. package/lib/build-artifacts/index.js +118 -0
  21. package/lib/cdk-deploy/cdk-deploy.d.ts +63 -0
  22. package/lib/cdk-deploy/cdk-deploy.js +175 -0
  23. package/lib/cdk-deploy/index.d.ts +1 -0
  24. package/lib/cdk-deploy/index.js +6 -0
  25. package/lib/cdk-deploy/start-deploy-handler.d.ts +8 -0
  26. package/lib/cdk-deploy/start-deploy-handler.js +72 -0
  27. package/lib/cdk-deploy/status-handler.d.ts +6 -0
  28. package/lib/cdk-deploy/status-handler.js +83 -0
  29. package/lib/cdk-pipelines/cloud-assembly-lookup-handler.d.ts +6 -0
  30. package/lib/cdk-pipelines/cloud-assembly-lookup-handler.js +63 -0
  31. package/lib/cdk-pipelines/index.d.ts +3 -0
  32. package/lib/cdk-pipelines/index.js +10 -0
  33. package/lib/cdk-pipelines/liflig-cdk-pipeline.d.ts +110 -0
  34. package/lib/cdk-pipelines/liflig-cdk-pipeline.js +232 -0
  35. package/lib/cdk-pipelines/slack-notification.d.ts +51 -0
  36. package/lib/cdk-pipelines/slack-notification.js +54 -0
  37. package/lib/cdk-pipelines/variables.d.ts +15 -0
  38. package/lib/cdk-pipelines/variables.js +80 -0
  39. package/lib/cloudtrail-slack-integration/cloudtrail-slack-integration.d.ts +47 -0
  40. package/lib/cloudtrail-slack-integration/cloudtrail-slack-integration.js +211 -0
  41. package/lib/cloudtrail-slack-integration/index.d.ts +1 -0
  42. package/lib/cloudtrail-slack-integration/index.js +6 -0
  43. package/lib/configure-parameters/configure-parameters.d.ts +61 -0
  44. package/lib/configure-parameters/configure-parameters.js +94 -0
  45. package/lib/configure-parameters/index.d.ts +1 -0
  46. package/lib/configure-parameters/index.js +6 -0
  47. package/lib/cross-region-ssm-parameter.d.ts +13 -0
  48. package/lib/cross-region-ssm-parameter.js +46 -0
  49. package/lib/ecs/cluster.d.ts +25 -0
  50. package/lib/ecs/cluster.js +70 -0
  51. package/lib/ecs/fargate-service.d.ts +63 -0
  52. package/lib/ecs/fargate-service.js +98 -0
  53. package/lib/ecs/index.d.ts +3 -0
  54. package/lib/ecs/index.js +10 -0
  55. package/lib/ecs/listener-rule.d.ts +25 -0
  56. package/lib/ecs/listener-rule.js +27 -0
  57. package/lib/ecs-update-image/artifact-status.d.ts +39 -0
  58. package/lib/ecs-update-image/artifact-status.js +41 -0
  59. package/lib/ecs-update-image/ecs-update-image.d.ts +41 -0
  60. package/lib/ecs-update-image/ecs-update-image.js +98 -0
  61. package/lib/ecs-update-image/index.d.ts +3 -0
  62. package/lib/ecs-update-image/index.js +10 -0
  63. package/lib/ecs-update-image/start-deploy-handler.d.ts +6 -0
  64. package/lib/ecs-update-image/start-deploy-handler.js +104 -0
  65. package/lib/ecs-update-image/status-handler.d.ts +11 -0
  66. package/lib/ecs-update-image/status-handler.js +74 -0
  67. package/lib/ecs-update-image/tag.d.ts +47 -0
  68. package/lib/ecs-update-image/tag.js +67 -0
  69. package/lib/feature-flags.d.ts +18 -0
  70. package/lib/feature-flags.js +48 -0
  71. package/lib/griid/artefact-bucket.d.ts +7 -0
  72. package/lib/griid/artefact-bucket.js +30 -0
  73. package/lib/griid/index.d.ts +4 -0
  74. package/lib/griid/index.js +18 -0
  75. package/lib/hosted-zone-with-param.d.ts +29 -0
  76. package/lib/hosted-zone-with-param.js +65 -0
  77. package/lib/index.d.ts +32 -0
  78. package/lib/kinesis/index.d.ts +1 -0
  79. package/lib/kinesis/index.js +6 -0
  80. package/lib/kinesis/kinesis-to-datadog-stream.d.ts +28 -0
  81. package/lib/kinesis/kinesis-to-datadog-stream.js +126 -0
  82. package/lib/load-balancer/index.d.ts +1 -0
  83. package/lib/load-balancer/index.js +6 -0
  84. package/lib/load-balancer/load-balancer.d.ts +16 -0
  85. package/lib/load-balancer/load-balancer.js +60 -0
  86. package/lib/pipelines/conventions.d.ts +14 -0
  87. package/lib/pipelines/conventions.js +24 -0
  88. package/lib/pipelines/deploy-env.d.ts +18 -0
  89. package/lib/pipelines/deploy-env.js +96 -0
  90. package/lib/pipelines/index.d.ts +2 -0
  91. package/lib/pipelines/index.js +8 -0
  92. package/lib/pipelines/liflig-cdk-deployer-deps.d.ts +13 -0
  93. package/lib/pipelines/liflig-cdk-deployer-deps.js +35 -0
  94. package/lib/pipelines/pipeline.d.ts +78 -0
  95. package/lib/pipelines/pipeline.js +224 -0
  96. package/lib/platform/index.d.ts +1 -0
  97. package/lib/platform/index.js +7 -0
  98. package/lib/platform/platform.d.ts +37 -0
  99. package/lib/platform/platform.js +57 -0
  100. package/lib/rds/database.d.ts +49 -0
  101. package/lib/rds/database.js +60 -0
  102. package/lib/rds/index.d.ts +1 -0
  103. package/lib/rds/index.js +6 -0
  104. package/lib/ses/configurationsetdeliveryoptions/index.d.ts +26 -0
  105. package/lib/ses/configurationsetdeliveryoptions/index.js +48 -0
  106. package/lib/ses/configurationsetsnsdestination/handler.d.ts +17 -0
  107. package/lib/ses/configurationsetsnsdestination/handler.js +75 -0
  108. package/lib/ses/configurationsetsnsdestination/index.d.ts +29 -0
  109. package/lib/ses/configurationsetsnsdestination/index.js +75 -0
  110. package/lib/ses/index.d.ts +4 -0
  111. package/lib/ses/index.js +12 -0
  112. package/lib/ses/sesdomain/handler.d.ts +10 -0
  113. package/lib/ses/sesdomain/handler.js +82 -0
  114. package/lib/ses/sesdomain/index.d.ts +57 -0
  115. package/lib/ses/sesdomain/index.js +94 -0
  116. package/lib/ses/sesverifyemail/handler.d.ts +9 -0
  117. package/lib/ses/sesverifyemail/handler.js +25 -0
  118. package/lib/ses/sesverifyemail/index.d.ts +13 -0
  119. package/lib/ses/sesverifyemail/index.js +51 -0
  120. package/lib/snapshots.d.ts +4 -0
  121. package/lib/snapshots.js +214 -0
  122. package/lib/ssm-parameter-backed-resource.d.ts +45 -0
  123. package/lib/ssm-parameter-backed-resource.js +67 -0
  124. package/lib/ssm-parameter-reader.d.ts +21 -0
  125. package/lib/ssm-parameter-reader.js +48 -0
  126. package/lib/tags.d.ts +8 -0
  127. package/lib/tags.js +36 -0
  128. package/lib/utils.d.ts +2 -0
  129. package/lib/utils.js +17 -0
  130. package/lib/webapp/index.d.ts +3 -0
  131. package/lib/webapp/index.js +10 -0
  132. package/lib/webapp/monitor.d.ts +187 -0
  133. package/lib/webapp/monitor.js +156 -0
  134. package/lib/webapp/security-headers.d.ts +38 -0
  135. package/lib/webapp/security-headers.js +129 -0
  136. package/lib/webapp/webapp.d.ts +116 -0
  137. package/lib/webapp/webapp.js +118 -0
  138. package/lib/webapp-deploy-via-role.d.ts +25 -0
  139. package/lib/webapp-deploy-via-role.js +32 -0
  140. package/package.json +4 -3
@@ -0,0 +1,116 @@
1
+ import * as constructs from "constructs";
2
+ import * as certificatemanager from "aws-cdk-lib/aws-certificatemanager";
3
+ import * as cloudfront from "aws-cdk-lib/aws-cloudfront";
4
+ import * as origins from "aws-cdk-lib/aws-cloudfront-origins";
5
+ import * as r53 from "aws-cdk-lib/aws-route53";
6
+ import * as s3 from "aws-cdk-lib/aws-s3";
7
+ import * as webappDeploy from "@capraconsulting/webapp-deploy-lambda";
8
+ import { WebappSecurityHeadersProps } from "./security-headers";
9
+ export interface WebappProps {
10
+ /**
11
+ * ACM certificate that covers the specifeid domain names.
12
+ *
13
+ * This certificate must be created in the region us-east-1.
14
+ *
15
+ * @default - The CloudFront wildcard certificate (*.cloudfront.net) will be used.
16
+ */
17
+ cloudfrontCertificate?: certificatemanager.ICertificate;
18
+ /**
19
+ * List of domain names the CloudFront distribution should use.
20
+ *
21
+ * @default - Generated name (e.g., d111111abcdef8.cloudfront.net)
22
+ */
23
+ domainNames?: string[];
24
+ /**
25
+ * AWS WAF web ACL to associate with the CloudFront distribution.
26
+ *
27
+ * To specify a web ACL created using the latest version of AWS WAF, use the ACL ARN, for example
28
+ * `arn:aws:wafv2:us-east-1:123456789012:global/webacl/ExampleWebACL/473e64fd-f30b-4765-81a0-62ad96dd167a`.
29
+ * To specify a web ACL created using AWS WAF Classic, use the ACL ID, for example `473e64fd-f30b-4765-81a0-62ad96dd167a`.
30
+ *
31
+ * @default - No AWS Web Application Firewall web access control list (web ACL).
32
+ */
33
+ webAclId?: string;
34
+ /**
35
+ * The path to the page that will be served for users not allowed to access
36
+ * the site when using WAF. E.g. "/4xx-errors/403-forbidden.html".
37
+ *
38
+ * Note that this wil catch any 403 errors from the origin(s), that might
39
+ * cover any other behaviors is added.
40
+ *
41
+ * @default - No custom page for 403 errors.
42
+ */
43
+ webAclErrorPagePath?: string;
44
+ /**
45
+ * Enable, disable or configure security headers for the web application
46
+ * @default - a set of strict security headers are configured by default
47
+ */
48
+ securityHeaders?: {
49
+ /**
50
+ * Enable adding common security headers to CloudFront responses
51
+ *
52
+ * If enabled, the default behavior is to add the following headers with fairly strict defaults. Most of the headers can be customized:
53
+ * - Content-Security-Policy
54
+ * - Referrer-Policy
55
+ * - Strict-Transport-Security
56
+ * - X-Content-Type-Options
57
+ * - X-Frame-Options
58
+ * - X-XSS-Protection
59
+ *
60
+ *
61
+ * @default true
62
+ */
63
+ enabled?: boolean;
64
+ /**
65
+ * Security headers overrides.
66
+ *
67
+ * Used to override certain default security header values if the webapp requires different settings than the defaults.
68
+ *
69
+ * NOTE: If you need to disable certain headers, you must explicitly set them to undefined
70
+ *
71
+ * @default - A set of strict security header values will be used
72
+ */
73
+ behaviorOverrides?: WebappSecurityHeadersProps;
74
+ };
75
+ /**
76
+ * Cloudfront behavior overrides.
77
+ *
78
+ * Used to override cloudfront behavior
79
+ *
80
+ * NOTE: ResponseHeadersPolicy defined here will overwrite BOTH the default security headers policy and
81
+ * any values specified in securityHeaders.behaviorOverrides.
82
+ */
83
+ overrideCloudFrontBehaviourOptions?: Partial<cloudfront.BehaviorOptions>;
84
+ }
85
+ /**
86
+ * CloudFront for a Single-Page-Application.
87
+ *
88
+ * A bucket will be created and its prefix "web" is used to
89
+ * serve files. Use the addDeployment method to automatically
90
+ * deploy files as part the the CDK deployment.
91
+ */
92
+ export declare class Webapp extends constructs.Construct {
93
+ readonly distribution: cloudfront.Distribution;
94
+ readonly webappBucket: s3.Bucket;
95
+ readonly webappOrigin: origins.S3Origin;
96
+ constructor(scope: constructs.Construct, id: string, props: WebappProps);
97
+ addDnsRecord(hostedZone: r53.IHostedZone, domainName: string): void;
98
+ /**
99
+ * Add a deployment using webapp-deploy-lambda.
100
+ *
101
+ * See https://github.com/capraconsulting/webapp-deploy-lambda
102
+ * for details about how this works.
103
+ */
104
+ addDeployment(
105
+ /**
106
+ * The deployment source.
107
+ */
108
+ source: webappDeploy.ISource, props?: {
109
+ /**
110
+ * Include source maps in the deployment.
111
+ *
112
+ * @default false
113
+ */
114
+ deploySourceMaps?: boolean;
115
+ }): void;
116
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Webapp = void 0;
4
+ const constructs = require("constructs");
5
+ const cloudfront = require("aws-cdk-lib/aws-cloudfront");
6
+ const origins = require("aws-cdk-lib/aws-cloudfront-origins");
7
+ const iam = require("aws-cdk-lib/aws-iam");
8
+ const r53 = require("aws-cdk-lib/aws-route53");
9
+ const r53t = require("aws-cdk-lib/aws-route53-targets");
10
+ const s3 = require("aws-cdk-lib/aws-s3");
11
+ const webappDeploy = require("@capraconsulting/webapp-deploy-lambda");
12
+ const security_headers_1 = require("./security-headers");
13
+ /**
14
+ * CloudFront for a Single-Page-Application.
15
+ *
16
+ * A bucket will be created and its prefix "web" is used to
17
+ * serve files. Use the addDeployment method to automatically
18
+ * deploy files as part the the CDK deployment.
19
+ */
20
+ class Webapp extends constructs.Construct {
21
+ constructor(scope, id, props) {
22
+ var _a, _b, _c, _d, _e;
23
+ super(scope, id);
24
+ if (props.webAclErrorPagePath != null && props.webAclId == null) {
25
+ throw new Error("webAclErrorPagePath set but webAclId is missing");
26
+ }
27
+ this.webappBucket = new s3.Bucket(this, "Bucket", {
28
+ encryption: s3.BucketEncryption.S3_MANAGED,
29
+ });
30
+ const originAccessIdentity = new cloudfront.OriginAccessIdentity(this, "OriginAccessIdentity");
31
+ this.webappBucket.addToResourcePolicy(new iam.PolicyStatement({
32
+ resources: [this.webappBucket.arnForObjects("*")],
33
+ actions: ["s3:GetObject"],
34
+ principals: [originAccessIdentity.grantPrincipal],
35
+ }));
36
+ this.webappBucket.addToResourcePolicy(new iam.PolicyStatement({
37
+ resources: [this.webappBucket.bucketArn],
38
+ // Grant s3:ListBucket so that CloudFront receives 404 from
39
+ // the origin rather than 403 when accessing files that
40
+ // does not exist. We cannot fallback to index.html for 403
41
+ // errors since it would also be served if using a WAF.
42
+ // See https://aws.amazon.com/premiumsupport/knowledge-center/s3-website-cloudfront-error-403/#The_requested_objects_must_exist_in_the_bucket
43
+ actions: ["s3:ListBucket"],
44
+ principals: [originAccessIdentity.grantPrincipal],
45
+ }));
46
+ this.webappOrigin = new origins.S3Origin(this.webappBucket, {
47
+ // webapp-deploy-lambda will upload files to this folder
48
+ // since it keeps some other administrative files outside.
49
+ originPath: "/web",
50
+ originAccessIdentity,
51
+ });
52
+ const errorResponses = [
53
+ {
54
+ httpStatus: 404,
55
+ responseHttpStatus: 200,
56
+ responsePagePath: "/index.html",
57
+ },
58
+ ];
59
+ if (props.webAclErrorPagePath != null) {
60
+ errorResponses.push({
61
+ httpStatus: 403,
62
+ responseHttpStatus: 403,
63
+ responsePagePath: props.webAclErrorPagePath,
64
+ });
65
+ }
66
+ let responseHeadersPolicy;
67
+ if (((_b = (_a = props.securityHeaders) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : true) &&
68
+ !((_d = (_c = props.overrideCloudFrontBehaviourOptions) === null || _c === void 0 ? void 0 : _c.responseHeadersPolicy) === null || _d === void 0 ? void 0 : _d.responseHeadersPolicyId)) {
69
+ const securityHeaders = new security_headers_1.WebappSecurityHeaders(this, "SecurityHeaders", {
70
+ ...(_e = props.securityHeaders) === null || _e === void 0 ? void 0 : _e.behaviorOverrides,
71
+ });
72
+ responseHeadersPolicy = securityHeaders.responseHeadersPolicy;
73
+ }
74
+ this.distribution = new cloudfront.Distribution(this, "Distribution", {
75
+ defaultBehavior: {
76
+ origin: this.webappOrigin,
77
+ viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
78
+ responseHeadersPolicy: responseHeadersPolicy,
79
+ ...props.overrideCloudFrontBehaviourOptions,
80
+ },
81
+ defaultRootObject: "index.html",
82
+ priceClass: cloudfront.PriceClass.PRICE_CLASS_100,
83
+ certificate: props.cloudfrontCertificate,
84
+ domainNames: props.domainNames,
85
+ errorResponses,
86
+ webAclId: props.webAclId,
87
+ });
88
+ }
89
+ addDnsRecord(hostedZone, domainName) {
90
+ new r53.ARecord(this, `DnsRecord${domainName}`, {
91
+ zone: hostedZone,
92
+ recordName: `${domainName}.`,
93
+ target: r53.RecordTarget.fromAlias(new r53t.CloudFrontTarget(this.distribution)),
94
+ });
95
+ }
96
+ /**
97
+ * Add a deployment using webapp-deploy-lambda.
98
+ *
99
+ * See https://github.com/capraconsulting/webapp-deploy-lambda
100
+ * for details about how this works.
101
+ */
102
+ addDeployment(
103
+ /**
104
+ * The deployment source.
105
+ */
106
+ source, props) {
107
+ var _a;
108
+ const deploySourceMaps = (_a = props === null || props === void 0 ? void 0 : props.deploySourceMaps) !== null && _a !== void 0 ? _a : false;
109
+ new webappDeploy.WebappDeploy(this, "Deploy", {
110
+ source: source,
111
+ webBucket: this.webappBucket,
112
+ distribution: this.distribution,
113
+ excludePattern: deploySourceMaps ? undefined : "\\.map$",
114
+ });
115
+ }
116
+ }
117
+ exports.Webapp = Webapp;
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYmFwcC93ZWJhcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBRXhDLHlEQUF3RDtBQUN4RCw4REFBNkQ7QUFDN0QsMkNBQTBDO0FBQzFDLCtDQUE4QztBQUM5Qyx3REFBdUQ7QUFDdkQseUNBQXdDO0FBQ3hDLHNFQUFxRTtBQUNyRSx5REFHMkI7QUErRTNCOzs7Ozs7R0FNRztBQUNILE1BQWEsTUFBTyxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBSzlDLFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBa0I7O1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO1FBQ3BFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ2hELFVBQVUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtTQUMzQyxDQUFDLENBQUE7UUFFRixNQUFNLG9CQUFvQixHQUFHLElBQUksVUFBVSxDQUFDLG9CQUFvQixDQUM5RCxJQUFJLEVBQ0osc0JBQXNCLENBQ3ZCLENBQUE7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUNuQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLGNBQWMs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Q1g7O09BRUc7SUFDSCxNQUE0QixFQUM1QixLQU9DOztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsZ0JBQWdCLG1DQUFJLEtBQUssQ0FBQTtRQUV6RCxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUM1QyxNQUFNLEVBQUUsTUFBTTtZQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDekQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBeklELHdCQXlJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY2VydGlmaWNhdGVtYW5hZ2VyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCJcbmltcG9ydCAqIGFzIG9yaWdpbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIHI1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIlxuaW1wb3J0ICogYXMgcjUzdCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiXG5pbXBvcnQgKiBhcyBzMyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCJcbmltcG9ydCAqIGFzIHdlYmFwcERlcGxveSBmcm9tIFwiQGNhcHJhY29uc3VsdGluZy93ZWJhcHAtZGVwbG95LWxhbWJkYVwiXG5pbXBvcnQge1xuICBXZWJhcHBTZWN1cml0eUhlYWRlcnMsXG4gIFdlYmFwcFNlY3VyaXR5SGVhZGVyc1Byb3BzLFxufSBmcm9tIFwiLi9zZWN1cml0eS1oZWFkZXJzXCJcblxuZXhwb3J0IGludGVyZmFjZSBXZWJhcHBQcm9wcyB7XG4gIC8qKlxuICAgKiBBQ00gY2VydGlmaWNhdGUgdGhhdCBjb3ZlcnMgdGhlIHNwZWNpZmVpZCBkb21haW4gbmFtZXMuXG4gICAqXG4gICAqIFRoaXMgY2VydGlmaWNhdGUgbXVzdCBiZSBjcmVhdGVkIGluIHRoZSByZWdpb24gdXMtZWFzdC0xLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBDbG91ZEZyb250IHdpbGRjYXJkIGNlcnRpZmljYXRlICgqLmNsb3VkZnJvbnQubmV0KSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBjbG91ZGZyb250Q2VydGlmaWNhdGU/OiBjZXJ0aWZpY2F0ZW1hbmFnZXIuSUNlcnRpZmljYXRlXG4gIC8qKlxuICAgKiBMaXN0IG9mIGRvbWFpbiBuYW1lcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gc2hvdWxkIHVzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBHZW5lcmF0ZWQgbmFtZSAoZS5nLiwgZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXQpXG4gICAqL1xuICBkb21haW5OYW1lcz86IHN0cmluZ1tdXG4gIC8qKlxuICAgKiBBV1MgV0FGIHdlYiBBQ0wgdG8gYXNzb2NpYXRlIHdpdGggdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBUbyBzcGVjaWZ5IGEgd2ViIEFDTCBjcmVhdGVkIHVzaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBBV1MgV0FGLCB1c2UgdGhlIEFDTCBBUk4sIGZvciBleGFtcGxlXG4gICAqIGBhcm46YXdzOndhZnYyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Z2xvYmFsL3dlYmFjbC9FeGFtcGxlV2ViQUNMLzQ3M2U2NGZkLWYzMGItNDc2NS04MWEwLTYyYWQ5NmRkMTY3YWAuXG4gICAqIFRvIHNwZWNpZnkgYSB3ZWIgQUNMIGNyZWF0ZWQgdXNpbmcgQVdTIFdBRiBDbGFzc2ljLCB1c2UgdGhlIEFDTCBJRCwgZm9yIGV4YW1wbGUgYDQ3M2U2NGZkLWYzMGItNDc2NS04MWEwLTYyYWQ5NmRkMTY3YWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gQVdTIFdlYiBBcHBsaWNhdGlvbiBGaXJld2FsbCB3ZWIgYWNjZXNzIGNvbnRyb2wgbGlzdCAod2ViIEFDTCkuXG4gICAqL1xuICB3ZWJBY2xJZD86IHN0cmluZ1xuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBhZ2UgdGhhdCB3aWxsIGJlIHNlcnZlZCBmb3IgdXNlcnMgbm90IGFsbG93ZWQgdG8gYWNjZXNzXG4gICAqIHRoZSBzaXRlIHdoZW4gdXNpbmcgV0FGLiBFLmcuIFwiLzR4eC1lcnJvcnMvNDAzLWZvcmJpZGRlbi5odG1sXCIuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHdpbCBjYXRjaCBhbnkgNDAzIGVycm9ycyBmcm9tIHRoZSBvcmlnaW4ocyksIHRoYXQgbWlnaHRcbiAgICogY292ZXIgYW55IG90aGVyIGJlaGF2aW9ycyBpcyBhZGRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBjdXN0b20gcGFnZSBmb3IgNDAzIGVycm9ycy5cbiAgICovXG4gIHdlYkFjbEVycm9yUGFnZVBhdGg/OiBzdHJpbmdcbiAgLyoqXG4gICAqICBFbmFibGUsIGRpc2FibGUgb3IgY29uZmlndXJlIHNlY3VyaXR5IGhlYWRlcnMgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb25cbiAgICogQGRlZmF1bHQgLSBhIHNldCBvZiBzdHJpY3Qgc2VjdXJpdHkgaGVhZGVycyBhcmUgY29uZmlndXJlZCBieSBkZWZhdWx0XG4gICAqL1xuICBzZWN1cml0eUhlYWRlcnM/OiB7XG4gICAgLyoqXG4gICAgICogRW5hYmxlIGFkZGluZyBjb21tb24gc2VjdXJpdHkgaGVhZGVycyB0byBDbG91ZEZyb250IHJlc3BvbnNlc1xuICAgICAqXG4gICAgICogSWYgZW5hYmxlZCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYWRkIHRoZSBmb2xsb3dpbmcgaGVhZGVycyB3aXRoIGZhaXJseSBzdHJpY3QgZGVmYXVsdHMuIE1vc3Qgb2YgdGhlIGhlYWRlcnMgY2FuIGJlIGN1c3RvbWl6ZWQ6XG4gICAgICogLSBDb250ZW50LVNlY3VyaXR5LVBvbGljeVxuICAgICAqIC0gUmVmZXJyZXItUG9saWN5XG4gICAgICogLSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5XG4gICAgICogLSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zXG4gICAgICogLSBYLUZyYW1lLU9wdGlvbnNcbiAgICAgKiAtIFgtWFNTLVByb3RlY3Rpb25cbiAgICAgKlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2VjdXJpdHkgaGVhZGVycyBvdmVycmlkZXMuXG4gICAgICpcbiAgICAgKiBVc2VkIHRvIG92ZXJyaWRlIGNlcnRhaW4gZGVmYXVsdCBzZWN1cml0eSBoZWFkZXIgdmFsdWVzIGlmIHRoZSB3ZWJhcHAgcmVxdWlyZXMgZGlmZmVyZW50IHNldHRpbmdzIHRoYW4gdGhlIGRlZmF1bHRzLlxuICAgICAqXG4gICAgICogTk9URTogSWYgeW91IG5lZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGhlYWRlcnMsIHlvdSBtdXN0IGV4cGxpY2l0bHkgc2V0IHRoZW0gdG8gdW5kZWZpbmVkXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAtIEEgc2V0IG9mIHN0cmljdCBzZWN1cml0eSBoZWFkZXIgdmFsdWVzIHdpbGwgYmUgdXNlZFxuICAgICAqL1xuICAgIGJlaGF2aW9yT3ZlcnJpZGVzPzogV2ViYXBwU2VjdXJpdHlIZWFkZXJzUHJvcHNcbiAgfVxuICAvKipcbiAgICogQ2xvdWRmcm9udCBiZWhhdmlvciBvdmVycmlkZXMuXG4gICAqXG4gICAqIFVzZWQgdG8gb3ZlcnJpZGUgY2xvdWRmcm9udCBiZWhhdmlvclxuICAgKlxuICAgKiBOT1RFOiBSZXNwb25zZUhlYWRlcnNQb2xpY3kgZGVmaW5lZCBoZXJlIHdpbGwgb3ZlcndyaXRlIEJPVEggdGhlIGRlZmF1bHQgc2VjdXJpdHkgaGVhZGVycyBwb2xpY3kgYW5kXG4gICAqIGFueSB2YWx1ZXMgc3BlY2lmaWVkIGluIHNlY3VyaXR5SGVhZGVycy5iZWhhdmlvck92ZXJyaWRlcy5cbiAgICovXG4gIG92ZXJyaWRlQ2xvdWRGcm9udEJlaGF2aW91ck9wdGlvbnM/OiBQYXJ0aWFsPGNsb3VkZnJvbnQuQmVoYXZpb3JPcHRpb25zPlxufVxuXG4vKipcbiAqIENsb3VkRnJvbnQgZm9yIGEgU2luZ2xlLVBhZ2UtQXBwbGljYXRpb24uXG4gKlxuICogQSBidWNrZXQgd2lsbCBiZSBjcmVhdGVkIGFuZCBpdHMgcHJlZml4IFwid2ViXCIgaXMgdXNlZCB0b1xuICogc2VydmUgZmlsZXMuIFVzZSB0aGUgYWRkRGVwbG95bWVudCBtZXRob2QgdG8gYXV0b21hdGljYWxseVxuICogZGVwbG95IGZpbGVzIGFzIHBhcnQgdGhlIHRoZSBDREsgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYmFwcCBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogY2xvdWRmcm9udC5EaXN0cmlidXRpb25cbiAgcHVibGljIHJlYWRvbmx5IHdlYmFwcEJ1Y2tldDogczMuQnVja2V0XG4gIHB1YmxpYyByZWFkb25seSB3ZWJhcHBPcmlnaW46IG9yaWdpbnMuUzNPcmlnaW5cblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJhcHBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGlmIChwcm9wcy53ZWJBY2xFcnJvclBhZ2VQYXRoICE9IG51bGwgJiYgcHJvcHMud2ViQWNsSWQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwid2ViQWNsRXJyb3JQYWdlUGF0aCBzZXQgYnV0IHdlYkFjbElkIGlzIG1pc3NpbmdcIilcbiAgICB9XG5cbiAgICB0aGlzLndlYmFwcEJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgXCJCdWNrZXRcIiwge1xuICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgIH0pXG5cbiAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eSA9IG5ldyBjbG91ZGZyb250Lk9yaWdpbkFjY2Vzc0lkZW50aXR5KFxuICAgICAgdGhpcyxcbiAgICAgIFwiT3JpZ2luQWNjZXNzSWRlbnRpdHlcIixcbiAgICApXG5cbiAgICB0aGlzLndlYmFwcEJ1Y2tldC5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLndlYmFwcEJ1Y2tldC5hcm5Gb3JPYmplY3RzKFwiKlwiKV0sXG4gICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiXSxcbiAgICAgICAgcHJpbmNpcGFsczogW29yaWdpbkFjY2Vzc0lkZW50aXR5LmdyYW50UHJpbmNpcGFsXSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHRoaXMud2ViYXBwQnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHJlc291cmNlczogW3RoaXMud2ViYXBwQnVja2V0LmJ1Y2tldEFybl0sXG4gICAgICAgIC8vIEdyYW50IHMzOkxpc3RCdWNrZXQgc28gdGhhdCBDbG91ZEZyb250IHJlY2VpdmVzIDQwNCBmcm9tXG4gICAgICAgIC8vIHRoZSBvcmlnaW4gcmF0aGVyIHRoYW4gNDAzIHdoZW4gYWNjZXNzaW5nIGZpbGVzIHRoYXRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QuIFdlIGNhbm5vdCBmYWxsYmFjayB0byBpbmRleC5odG1sIGZvciA0MDNcbiAgICAgICAgLy8gZXJyb3JzIHNpbmNlIGl0IHdvdWxkIGFsc28gYmUgc2VydmVkIGlmIHVzaW5nIGEgV0FGLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9wcmVtaXVtc3VwcG9ydC9rbm93bGVkZ2UtY2VudGVyL3MzLXdlYnNpdGUtY2xvdWRmcm9udC1lcnJvci00MDMvI1RoZV9yZXF1ZXN0ZWRfb2JqZWN0c19tdXN0X2V4aXN0X2luX3RoZV9idWNrZXRcbiAgICAgICAgYWN0aW9uczogW1wiczM6TGlzdEJ1Y2tldFwiXSxcbiAgICAgICAgcHJpbmNpcGFsczogW29yaWdpbkFjY2Vzc0lkZW50aXR5LmdyYW50UHJpbmNpcGFsXSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHRoaXMud2ViYXBwT3JpZ2luID0gbmV3IG9yaWdpbnMuUzNPcmlnaW4odGhpcy53ZWJhcHBCdWNrZXQsIHtcbiAgICAgIC8vIHdlYmFwcC1kZXBsb3ktbGFtYmRhIHdpbGwgdXBsb2FkIGZpbGVzIHRvIHRoaXMgZm9sZGVyXG4gICAgICAvLyBzaW5jZSBpdCBrZWVwcyBzb21lIG90aGVyIGFkbWluaXN0cmF0aXZlIGZpbGVzIG91dHNpZGUuXG4gICAgICBvcmlnaW5QYXRoOiBcIi93ZWJcIixcbiAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIH0pXG5cbiAgICBjb25zdCBlcnJvclJlc3BvbnNlczogY2xvdWRmcm9udC5FcnJvclJlc3BvbnNlW10gPSBbXG4gICAgICB7XG4gICAgICAgIGh0dHBTdGF0dXM6IDQwNCxcbiAgICAgICAgcmVzcG9uc2VIdHRwU3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IFwiL2luZGV4Lmh0bWxcIixcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgaWYgKHByb3BzLndlYkFjbEVycm9yUGFnZVBhdGggIT0gbnVsbCkge1xuICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgIGh0dHBTdGF0dXM6IDQwMyxcbiAgICAgICAgcmVzcG9uc2VIdHRwU3RhdHVzOiA0MDMsXG4gICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IHByb3BzLndlYkFjbEVycm9yUGFnZVBhdGgsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxldCByZXNwb25zZUhlYWRlcnNQb2xpY3k6IGNsb3VkZnJvbnQuSVJlc3BvbnNlSGVhZGVyc1BvbGljeSB8IHVuZGVmaW5lZFxuXG4gICAgaWYgKFxuICAgICAgKHByb3BzLnNlY3VyaXR5SGVhZGVycz8uZW5hYmxlZCA/PyB0cnVlKSAmJlxuICAgICAgIXByb3BzLm92ZXJyaWRlQ2xvdWRGcm9udEJlaGF2aW91ck9wdGlvbnM/LnJlc3BvbnNlSGVhZGVyc1BvbGljeVxuICAgICAgICA/LnJlc3BvbnNlSGVhZGVyc1BvbGljeUlkXG4gICAgKSB7XG4gICAgICBjb25zdCBzZWN1cml0eUhlYWRlcnMgPSBuZXcgV2ViYXBwU2VjdXJpdHlIZWFkZXJzKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlNlY3VyaXR5SGVhZGVyc1wiLFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucHJvcHMuc2VjdXJpdHlIZWFkZXJzPy5iZWhhdmlvck92ZXJyaWRlcyxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9IHNlY3VyaXR5SGVhZGVycy5yZXNwb25zZUhlYWRlcnNQb2xpY3lcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RyaWJ1dGlvbiA9IG5ldyBjbG91ZGZyb250LkRpc3RyaWJ1dGlvbih0aGlzLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBkZWZhdWx0QmVoYXZpb3I6IHtcbiAgICAgICAgb3JpZ2luOiB0aGlzLndlYmFwcE9yaWdpbixcbiAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNsb3VkZnJvbnQuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeTogcmVzcG9uc2VIZWFkZXJzUG9saWN5LFxuICAgICAgICAuLi5wcm9wcy5vdmVycmlkZUNsb3VkRnJvbnRCZWhhdmlvdXJPcHRpb25zLFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRSb290T2JqZWN0OiBcImluZGV4Lmh0bWxcIixcbiAgICAgIHByaWNlQ2xhc3M6IGNsb3VkZnJvbnQuUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAsXG4gICAgICBjZXJ0aWZpY2F0ZTogcHJvcHMuY2xvdWRmcm9udENlcnRpZmljYXRlLFxuICAgICAgZG9tYWluTmFtZXM6IHByb3BzLmRvbWFpbk5hbWVzLFxuICAgICAgZXJyb3JSZXNwb25zZXMsXG4gICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsSWQsXG4gICAgfSlcbiAgfVxuXG4gIGFkZERuc1JlY29yZChob3N0ZWRab25lOiByNTMuSUhvc3RlZFpvbmUsIGRvbWFpbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIG5ldyByNTMuQVJlY29yZCh0aGlzLCBgRG5zUmVjb3JkJHtkb21haW5OYW1lfWAsIHtcbiAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICByZWNvcmROYW1lOiBgJHtkb21haW5OYW1lfS5gLFxuICAgICAgdGFyZ2V0OiByNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHI1M3QuQ2xvdWRGcm9udFRhcmdldCh0aGlzLmRpc3RyaWJ1dGlvbiksXG4gICAgICApLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZGVwbG95bWVudCB1c2luZyB3ZWJhcHAtZGVwbG95LWxhbWJkYS5cbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByYWNvbnN1bHRpbmcvd2ViYXBwLWRlcGxveS1sYW1iZGFcbiAgICogZm9yIGRldGFpbHMgYWJvdXQgaG93IHRoaXMgd29ya3MuXG4gICAqL1xuICBhZGREZXBsb3ltZW50KFxuICAgIC8qKlxuICAgICAqIFRoZSBkZXBsb3ltZW50IHNvdXJjZS5cbiAgICAgKi9cbiAgICBzb3VyY2U6IHdlYmFwcERlcGxveS5JU291cmNlLFxuICAgIHByb3BzPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBJbmNsdWRlIHNvdXJjZSBtYXBzIGluIHRoZSBkZXBsb3ltZW50LlxuICAgICAgICpcbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlcGxveVNvdXJjZU1hcHM/OiBib29sZWFuXG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVwbG95U291cmNlTWFwcyA9IHByb3BzPy5kZXBsb3lTb3VyY2VNYXBzID8/IGZhbHNlXG5cbiAgICBuZXcgd2ViYXBwRGVwbG95LldlYmFwcERlcGxveSh0aGlzLCBcIkRlcGxveVwiLCB7XG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIHdlYkJ1Y2tldDogdGhpcy53ZWJhcHBCdWNrZXQsXG4gICAgICBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLFxuICAgICAgZXhjbHVkZVBhdHRlcm46IGRlcGxveVNvdXJjZU1hcHMgPyB1bmRlZmluZWQgOiBcIlxcXFwubWFwJFwiLFxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import * as constructs from "constructs";
2
+ import { WebappDeployProps } from "@capraconsulting/webapp-deploy-lambda";
3
+ interface Props {
4
+ /**
5
+ * Reference to the IAM Role that will be granted permission to
6
+ * assume the CI role. This role must have permission to assume
7
+ * the CI role.
8
+ */
9
+ externalRoleArn: string;
10
+ /**
11
+ * The name of the role that will be created.
12
+ */
13
+ roleName: string;
14
+ webappDeploy: WebappDeployProps;
15
+ }
16
+ /**
17
+ * Provide the construct described at
18
+ * https://github.com/capraconsulting/webapp-deploy-lambda
19
+ * in combination with a separate role to be used to
20
+ * trigger the process.
21
+ */
22
+ export declare class WebappDeployViaRole extends constructs.Construct {
23
+ constructor(scope: constructs.Construct, id: string, props: Props);
24
+ }
25
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebappDeployViaRole = void 0;
4
+ const constructs = require("constructs");
5
+ const iam = require("aws-cdk-lib/aws-iam");
6
+ const cdk = require("aws-cdk-lib");
7
+ const webapp_deploy_lambda_1 = require("@capraconsulting/webapp-deploy-lambda");
8
+ /**
9
+ * Provide the construct described at
10
+ * https://github.com/capraconsulting/webapp-deploy-lambda
11
+ * in combination with a separate role to be used to
12
+ * trigger the process.
13
+ */
14
+ class WebappDeployViaRole extends constructs.Construct {
15
+ constructor(scope, id, props) {
16
+ super(scope, id);
17
+ const roleToBeAssumedForDeploy = new iam.Role(this, "Role", {
18
+ assumedBy: new iam.ArnPrincipal(props.externalRoleArn),
19
+ roleName: props.roleName,
20
+ });
21
+ const webappDeploy = new webapp_deploy_lambda_1.WebappDeploy(this, "Resource", props.webappDeploy);
22
+ webappDeploy.deployFn.grantInvoke(roleToBeAssumedForDeploy);
23
+ new cdk.CfnOutput(this, "FunctionArnOutput", {
24
+ value: webappDeploy.deployFn.functionArn,
25
+ });
26
+ new cdk.CfnOutput(this, "RoleArnOutput", {
27
+ value: roleToBeAssumedForDeploy.roleArn,
28
+ });
29
+ }
30
+ }
31
+ exports.WebappDeployViaRole = WebappDeployViaRole;
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwLWRlcGxveS12aWEtcm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJhcHAtZGVwbG95LXZpYS1yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUN4QywyQ0FBMEM7QUFDMUMsbUNBQWtDO0FBQ2xDLGdGQUc4QztBQWdCOUM7Ozs7O0dBS0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQzNELFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBWTtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDMUQsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ3RELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN6QixDQUFDLENBQUE7UUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLG1DQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFM0UsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUUzRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzNDLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVc7U0FDekMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDdkMsS0FBSyxFQUFFLHdCQUF3QixDQUFDLE9BQU87U0FDeEMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBcEJELGtEQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHtcbiAgV2ViYXBwRGVwbG95LFxuICBXZWJhcHBEZXBsb3lQcm9wcyxcbn0gZnJvbSBcIkBjYXByYWNvbnN1bHRpbmcvd2ViYXBwLWRlcGxveS1sYW1iZGFcIlxuXG5pbnRlcmZhY2UgUHJvcHMge1xuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBJQU0gUm9sZSB0aGF0IHdpbGwgYmUgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvXG4gICAqIGFzc3VtZSB0aGUgQ0kgcm9sZS4gVGhpcyByb2xlIG11c3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFzc3VtZVxuICAgKiB0aGUgQ0kgcm9sZS5cbiAgICovXG4gIGV4dGVybmFsUm9sZUFybjogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcm9sZSB0aGF0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHJvbGVOYW1lOiBzdHJpbmdcbiAgd2ViYXBwRGVwbG95OiBXZWJhcHBEZXBsb3lQcm9wc1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIGNvbnN0cnVjdCBkZXNjcmliZWQgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByYWNvbnN1bHRpbmcvd2ViYXBwLWRlcGxveS1sYW1iZGFcbiAqIGluIGNvbWJpbmF0aW9uIHdpdGggYSBzZXBhcmF0ZSByb2xlIHRvIGJlIHVzZWQgdG9cbiAqIHRyaWdnZXIgdGhlIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJhcHBEZXBsb3lWaWFSb2xlIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IHJvbGVUb0JlQXNzdW1lZEZvckRlcGxveSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBcIlJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFyblByaW5jaXBhbChwcm9wcy5leHRlcm5hbFJvbGVBcm4pLFxuICAgICAgcm9sZU5hbWU6IHByb3BzLnJvbGVOYW1lLFxuICAgIH0pXG5cbiAgICBjb25zdCB3ZWJhcHBEZXBsb3kgPSBuZXcgV2ViYXBwRGVwbG95KHRoaXMsIFwiUmVzb3VyY2VcIiwgcHJvcHMud2ViYXBwRGVwbG95KVxuXG4gICAgd2ViYXBwRGVwbG95LmRlcGxveUZuLmdyYW50SW52b2tlKHJvbGVUb0JlQXNzdW1lZEZvckRlcGxveSlcblxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsIFwiRnVuY3Rpb25Bcm5PdXRwdXRcIiwge1xuICAgICAgdmFsdWU6IHdlYmFwcERlcGxveS5kZXBsb3lGbi5mdW5jdGlvbkFybixcbiAgICB9KVxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsIFwiUm9sZUFybk91dHB1dFwiLCB7XG4gICAgICB2YWx1ZTogcm9sZVRvQmVBc3N1bWVkRm9yRGVwbG95LnJvbGVBcm4sXG4gICAgfSlcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "2.18.5",
3
+ "version": "2.18.7",
4
4
  "description": "CDK library for Liflig",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,8 @@
35
35
  },
36
36
  "overrides": {
37
37
  "semantic-release": {
38
- "@semantic-release/npm": "11.0.1"
38
+ "@semantic-release/npm": "10.0.6",
39
+ "@semantic-release/github": "9.2.5"
39
40
  }
40
41
  },
41
42
  "devDependencies": {
@@ -57,7 +58,7 @@
57
58
  "jest": "29.7.0",
58
59
  "jest-cdk-snapshot": "2.0.1",
59
60
  "prettier": "3.1.1",
60
- "semantic-release": "22.0.8",
61
+ "semantic-release": "22.0.12",
61
62
  "ts-jest": "29.1.1",
62
63
  "ts-node": "10.9.2",
63
64
  "typescript": "5.3.3"