@pwrdrvr/microapps-cdk 0.0.28 → 0.0.29

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.
@@ -1,100 +1,182 @@
1
1
  "use strict";
2
+ var _a;
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
4
  exports.MicroAppsCF = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const path_1 = require("path");
4
7
  const cf = require("@aws-cdk/aws-cloudfront");
5
8
  const cforigins = require("@aws-cdk/aws-cloudfront-origins");
6
9
  const r53 = require("@aws-cdk/aws-route53");
7
10
  const r53targets = require("@aws-cdk/aws-route53-targets");
8
11
  const cdk = require("@aws-cdk/core");
12
+ const ReverseDomain_1 = require("./utils/ReverseDomain");
13
+ /**
14
+ * @stability stable
15
+ */
9
16
  class MicroAppsCF extends cdk.Construct {
17
+ /**
18
+ * MicroApps - Create just CloudFront resources.
19
+ *
20
+ * @stability stable
21
+ */
10
22
  constructor(scope, id, props) {
11
23
  super(scope, id);
12
24
  if (props === undefined) {
13
25
  throw new Error('props must be set');
14
26
  }
15
- const { s3Exports, domainNameEdge, domainNameOrigin, reverseDomainName, autoDeleteEverything, certEdge, assetNameRoot, assetNameSuffix, r53ZoneName, r53ZoneID, } = props;
27
+ if ((props.r53Zone === undefined && props.domainNameEdge !== undefined) ||
28
+ (props.r53Zone !== undefined && props.domainNameEdge === undefined)) {
29
+ throw new Error('If either of r53Zone or domainNameEdge are set then the other must be set');
30
+ }
31
+ const { domainNameEdge, domainNameOrigin, httpApi, removalPolicy, certEdge, assetNameRoot, assetNameSuffix, r53Zone, bucketLogs, bucketAppsOrigin, rootPathPrefix, } = props;
32
+ const apigwyOriginRequestPolicy = MicroAppsCF.createAPIOriginPolicy(this, {
33
+ assetNameRoot,
34
+ assetNameSuffix,
35
+ domainNameEdge,
36
+ });
37
+ //
38
+ // Determine URL of the origin FQDN
39
+ //
40
+ let httpOriginFQDN = 'invalid.pwrdrvr.com';
41
+ if (domainNameOrigin !== undefined) {
42
+ httpOriginFQDN = domainNameOrigin;
43
+ }
44
+ else {
45
+ httpOriginFQDN = `${httpApi.apiId}.execute-api.${cdk.Aws.REGION}.amazonaws.com`;
46
+ }
16
47
  //
17
48
  // CloudFront Distro
18
49
  //
19
- const apiGwyOrigin = new cforigins.HttpOrigin(domainNameOrigin, {
50
+ const apiGwyOrigin = new cforigins.HttpOrigin(httpOriginFQDN, {
20
51
  protocolPolicy: cf.OriginProtocolPolicy.HTTPS_ONLY,
21
52
  originSslProtocols: [cf.OriginSslPolicy.TLS_V1_2],
22
53
  });
23
- this._cloudFrontDistro = new cf.Distribution(this, 'microapps-cloudfront', {
24
- comment: `${assetNameRoot}${assetNameSuffix}`,
25
- domainNames: [domainNameEdge],
54
+ this._cloudFrontDistro = new cf.Distribution(this, 'cft', {
55
+ comment: assetNameRoot ? `${assetNameRoot}${assetNameSuffix}` : domainNameEdge,
56
+ domainNames: domainNameEdge !== undefined ? [domainNameEdge] : undefined,
26
57
  certificate: certEdge,
27
58
  httpVersion: cf.HttpVersion.HTTP2,
28
59
  defaultBehavior: {
29
60
  allowedMethods: cf.AllowedMethods.ALLOW_ALL,
30
61
  cachePolicy: cf.CachePolicy.CACHING_DISABLED,
31
62
  compress: true,
32
- originRequestPolicy: cf.OriginRequestPolicy.ALL_VIEWER,
63
+ originRequestPolicy: apigwyOriginRequestPolicy,
33
64
  origin: apiGwyOrigin,
34
65
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
35
66
  },
36
67
  enableIpv6: true,
37
68
  priceClass: cf.PriceClass.PRICE_CLASS_100,
38
- enableLogging: true,
39
- logBucket: props.s3Exports.bucketLogs,
40
- logFilePrefix: `${reverseDomainName}/cloudfront-raw/`,
69
+ logBucket: bucketLogs,
70
+ logFilePrefix: props.domainNameEdge
71
+ ? `${ReverseDomain_1.reverseDomain(props.domainNameEdge)}/cloudfront-raw/`
72
+ : undefined,
73
+ });
74
+ if (removalPolicy !== undefined) {
75
+ this._cloudFrontDistro.applyRemovalPolicy(removalPolicy);
76
+ }
77
+ // Add routes to the CloudFront Distribution
78
+ MicroAppsCF.addRoutes(scope, {
79
+ apiGwyOrigin,
80
+ bucketAppsOrigin,
81
+ distro: this._cloudFrontDistro,
82
+ apigwyOriginRequestPolicy: apigwyOriginRequestPolicy,
83
+ rootPathPrefix,
41
84
  });
42
- if (autoDeleteEverything) {
43
- this._cloudFrontDistro.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
85
+ //
86
+ // Create the edge name for the CloudFront distro
87
+ //
88
+ if (r53Zone !== undefined) {
89
+ const rrAppsEdge = new r53.RecordSet(this, 'edge-arecord', {
90
+ recordName: domainNameEdge,
91
+ recordType: r53.RecordType.A,
92
+ target: r53.RecordTarget.fromAlias(new r53targets.CloudFrontTarget(this._cloudFrontDistro)),
93
+ zone: r53Zone,
94
+ });
95
+ if (removalPolicy !== undefined) {
96
+ rrAppsEdge.applyRemovalPolicy(removalPolicy);
97
+ }
44
98
  }
99
+ }
100
+ /**
101
+ * Create or get the origin request policy.
102
+ *
103
+ * If a custom domain name is NOT used for the origin then a policy
104
+ * will be created.
105
+ *
106
+ * If a custom domain name IS used for the origin then the ALL_VIEWER
107
+ * policy will be returned. This policy passes the Host header to the
108
+ * origin, which is fine when using a custom domain name on the origin.
109
+ *
110
+ * @stability stable
111
+ */
112
+ static createAPIOriginPolicy(scope, props) {
113
+ const { assetNameRoot, assetNameSuffix, domainNameEdge } = props;
114
+ let apigwyOriginRequestPolicy = cf.OriginRequestPolicy.ALL_VIEWER;
115
+ if (domainNameEdge === undefined) {
116
+ // When not using a custom domain name we must limit down the origin policy to
117
+ // prevent it from passing the Host header (distribution_id.cloudfront.net) to
118
+ // apigwy which will then reject it with a 403 because it does not match the
119
+ // execute-api name that apigwy is expecting.
120
+ //
121
+ // 2021-12-28 - There is a bug in the name generation that causes the same asset
122
+ // in different stacks to have the same generated name. We have to make the id
123
+ // in all cases to ensure the generated name is unique.
124
+ apigwyOriginRequestPolicy = new cf.OriginRequestPolicy(scope, `apigwy-origin-policy-${cdk.Stack.of(scope).stackName}`, {
125
+ comment: assetNameRoot ? `${assetNameRoot}-apigwy${assetNameSuffix}` : undefined,
126
+ originRequestPolicyName: assetNameRoot
127
+ ? `${assetNameRoot}-apigwy${assetNameSuffix}`
128
+ : undefined,
129
+ cookieBehavior: cf.OriginRequestCookieBehavior.all(),
130
+ queryStringBehavior: cf.OriginRequestQueryStringBehavior.all(),
131
+ headerBehavior: cf.OriginRequestHeaderBehavior.allowList('user-agent', 'referer'),
132
+ });
133
+ }
134
+ return apigwyOriginRequestPolicy;
135
+ }
136
+ /**
137
+ * Add API Gateway and S3 routes to an existing CloudFront Distribution.
138
+ *
139
+ * @stability stable
140
+ */
141
+ static addRoutes(_scope, props) {
142
+ const { apiGwyOrigin, bucketAppsOrigin, distro, apigwyOriginRequestPolicy, rootPathPrefix = '', } = props;
45
143
  //
46
144
  // Add Behaviors
47
145
  //
48
- const apiGwyBehavior = {
49
- allowedMethods: cf.AllowedMethods.ALLOW_ALL,
50
- cachePolicy: cf.CachePolicy.CACHING_DISABLED,
51
- compress: true,
52
- originRequestPolicy: cf.OriginRequestPolicy.ALL_VIEWER,
53
- viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
54
- };
55
- const s3Behavior = {
146
+ const s3BehaviorOptions = {
56
147
  allowedMethods: cf.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
57
148
  cachePolicy: cf.CachePolicy.CACHING_OPTIMIZED,
58
149
  compress: true,
59
150
  originRequestPolicy: cf.OriginRequestPolicy.CORS_S3_ORIGIN,
60
151
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
61
152
  };
62
- const apiGwyVersionRootBehavior = {
63
- allowedMethods: cf.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
64
- cachePolicy: cf.CachePolicy.CACHING_OPTIMIZED,
153
+ const apiGwyBehaviorOptions = {
154
+ allowedMethods: cf.AllowedMethods.ALLOW_ALL,
155
+ // TODO: Caching needs to be set by the app response
156
+ cachePolicy: cf.CachePolicy.CACHING_DISABLED,
65
157
  compress: true,
158
+ originRequestPolicy: apigwyOriginRequestPolicy,
66
159
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
67
160
  };
68
161
  //
69
- // Setup Routes
70
- // Pull to the API first, then pull to S3 if it contains /static/
71
- // Pull anything under /appName/x.y.z/ folder with '.' in file name to S3
72
- // Let everything else fall through to the API Gateway
162
+ // All static assets are assumed to have a dot in them
73
163
  //
74
- this._cloudFrontDistro.addBehavior('/*/*/api/*', apiGwyOrigin, apiGwyBehavior);
75
- this._cloudFrontDistro.addBehavior('/*/*/static/*', s3Exports.bucketAppsOrigin, s3Behavior);
76
- this._cloudFrontDistro.addBehavior('/*/*/*.*', s3Exports.bucketAppsOrigin, s3Behavior);
77
- this._cloudFrontDistro.addBehavior('/*/*/', apiGwyOrigin, apiGwyVersionRootBehavior);
164
+ distro.addBehavior(path_1.posix.join(rootPathPrefix, '/*/*/*.*'), bucketAppsOrigin, s3BehaviorOptions);
78
165
  //
79
- // Create the edge name for the CloudFront distro
166
+ // Everything that isn't a static asset is going to API Gateway
167
+ // There is no trailing slash because Serverless Next.js wants
168
+ // go load pages at /release/0.0.3 (with no trailing slash).
80
169
  //
81
- const zone = r53.HostedZone.fromHostedZoneAttributes(this, 'microapps-zone', {
82
- zoneName: r53ZoneName,
83
- hostedZoneId: r53ZoneID,
84
- });
85
- const rrAppsEdge = new r53.RecordSet(this, 'microapps-edge-arecord', {
86
- recordName: domainNameEdge,
87
- recordType: r53.RecordType.A,
88
- target: r53.RecordTarget.fromAlias(new r53targets.CloudFrontTarget(this._cloudFrontDistro)),
89
- zone,
90
- });
91
- if (autoDeleteEverything) {
92
- rrAppsEdge.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
93
- }
170
+ distro.addBehavior(path_1.posix.join(rootPathPrefix, '/*'), apiGwyOrigin, apiGwyBehaviorOptions);
94
171
  }
172
+ /**
173
+ * @stability stable
174
+ */
95
175
  get cloudFrontDistro() {
96
176
  return this._cloudFrontDistro;
97
177
  }
98
178
  }
99
179
  exports.MicroAppsCF = MicroAppsCF;
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzQ0YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWljcm9BcHBzQ0YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsOENBQThDO0FBQzlDLDZEQUE2RDtBQUM3RCw0Q0FBNEM7QUFDNUMsMkRBQTJEO0FBQzNELHFDQUFxQztBQXdCckMsTUFBYSxXQUFZLFNBQVEsR0FBRyxDQUFDLFNBQVM7SUFNNUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEM7UUFFRCxNQUFNLEVBQ0osU0FBUyxFQUNULGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsYUFBYSxFQUNiLGVBQWUsRUFDZixXQUFXLEVBQ1gsU0FBUyxHQUNWLEdBQUcsS0FBSyxDQUFDO1FBRVYsRUFBRTtRQUNGLG9CQUFvQjtRQUNwQixFQUFFO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFO1lBQzlELGNBQWMsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsVUFBVTtZQUNsRCxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1NBQ2xELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3pFLE9BQU8sRUFBRSxHQUFHLGFBQWEsR0FBRyxlQUFlLEVBQUU7WUFDN0MsV0FBVyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzdCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDakMsZUFBZSxFQUFFO2dCQUNmLGNBQWMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVM7Z0JBQzNDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtnQkFDNUMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFVBQVU7Z0JBQ3RELE1BQU0sRUFBRSxZQUFZO2dCQUNwQixvQkFBb0IsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCO2FBQ2hFO1lBQ0QsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZTtZQUN6QyxhQUFhLEVBQUUsSUFBSTtZQUNuQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVO1lBQ3JDLGFBQWEsRUFBRSxHQUFHLGlCQUFpQixrQkFBa0I7U0FDdEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxvQkFBb0IsRUFBRTtZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN0RTtRQUVELEVBQUU7UUFDRixnQkFBZ0I7UUFDaEIsRUFBRTtRQUNGLE1BQU0sY0FBYyxHQUEwQjtZQUM1QyxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxTQUFTO1lBQzNDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtZQUM1QyxRQUFRLEVBQUUsSUFBSTtZQUNkLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVO1lBQ3RELG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUI7U0FDaEUsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUEwQjtZQUN4QyxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0I7WUFDeEQsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCO1lBQzdDLFFBQVEsRUFBRSxJQUFJO1lBQ2QsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLGNBQWM7WUFDMUQsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQjtTQUNoRSxDQUFDO1FBQ0YsTUFBTSx5QkFBeUIsR0FBMEI7WUFDdkQsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCO1lBQ3hELFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQjtZQUM3QyxRQUFRLEVBQUUsSUFBSTtZQUNkLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUI7U0FDaEUsQ0FBQztRQUVGLEVBQUU7UUFDRixlQUFlO1FBQ2YsaUVBQWlFO1FBQ2pFLHlFQUF5RTtRQUN6RSxzREFBc0Q7UUFDdEQsRUFBRTtRQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBRXJGLEVBQUU7UUFDRixpREFBaUQ7UUFDakQsRUFBRTtRQUVGLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzNFLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxTQUFTO1NBQ3hCLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDbkUsVUFBVSxFQUFFLGNBQWM7WUFDMUIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1QixNQUFNLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0YsSUFBSTtTQUNMLENBQUMsQ0FBQztRQUNILElBQUksb0JBQW9CLEVBQUU7WUFDeEIsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBM0dELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0EwR0Y7QUE5R0Qsa0NBOEdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYWNtIGZyb20gJ0Bhd3MtY2RrL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0ICogYXMgY2YgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgY2ZvcmlnaW5zIGZyb20gJ0Bhd3MtY2RrL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0ICogYXMgcjUzIGZyb20gJ0Bhd3MtY2RrL2F3cy1yb3V0ZTUzJztcbmltcG9ydCAqIGFzIHI1M3RhcmdldHMgZnJvbSAnQGF3cy1jZGsvYXdzLXJvdXRlNTMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBJTWljcm9BcHBzUzNFeHBvcnRzIH0gZnJvbSAnLi9NaWNyb0FwcHNTMyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1pY3JvQXBwc0NGRXhwb3J0cyB7XG4gIHJlYWRvbmx5IGNsb3VkRnJvbnREaXN0cm86IGNmLkRpc3RyaWJ1dGlvbjtcbn1cblxuaW50ZXJmYWNlIE1pY3JvQXBwc0NGUHJvcHMgZXh0ZW5kcyBjZGsuUmVzb3VyY2VQcm9wcyB7XG4gIHJlYWRvbmx5IGF1dG9EZWxldGVFdmVyeXRoaW5nOiBib29sZWFuO1xuICByZWFkb25seSBzM0V4cG9ydHM6IElNaWNyb0FwcHNTM0V4cG9ydHM7XG4gIHJlYWRvbmx5IHJldmVyc2VEb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZG9tYWluTmFtZUVkZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgZG9tYWluTmFtZU9yaWdpbjogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgY2VydEVkZ2U6IGFjbS5JQ2VydGlmaWNhdGU7XG5cbiAgcmVhZG9ubHkgcjUzWm9uZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcjUzWm9uZUlEOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWNyb0FwcHNDRiBleHRlbmRzIGNkay5Db25zdHJ1Y3QgaW1wbGVtZW50cyBJTWljcm9BcHBzQ0ZFeHBvcnRzIHtcbiAgcHJpdmF0ZSBfY2xvdWRGcm9udERpc3RybzogY2YuRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgZ2V0IGNsb3VkRnJvbnREaXN0cm8oKTogY2YuRGlzdHJpYnV0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvdWRGcm9udERpc3RybztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IE1pY3JvQXBwc0NGUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcHMgbXVzdCBiZSBzZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBzM0V4cG9ydHMsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICByZXZlcnNlRG9tYWluTmFtZSxcbiAgICAgIGF1dG9EZWxldGVFdmVyeXRoaW5nLFxuICAgICAgY2VydEVkZ2UsXG4gICAgICBhc3NldE5hbWVSb290LFxuICAgICAgYXNzZXROYW1lU3VmZml4LFxuICAgICAgcjUzWm9uZU5hbWUsXG4gICAgICByNTNab25lSUQsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy9cbiAgICAvLyBDbG91ZEZyb250IERpc3Ryb1xuICAgIC8vXG4gICAgY29uc3QgYXBpR3d5T3JpZ2luID0gbmV3IGNmb3JpZ2lucy5IdHRwT3JpZ2luKGRvbWFpbk5hbWVPcmlnaW4sIHtcbiAgICAgIHByb3RvY29sUG9saWN5OiBjZi5PcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgICAgb3JpZ2luU3NsUHJvdG9jb2xzOiBbY2YuT3JpZ2luU3NsUG9saWN5LlRMU19WMV8yXSxcbiAgICB9KTtcbiAgICB0aGlzLl9jbG91ZEZyb250RGlzdHJvID0gbmV3IGNmLkRpc3RyaWJ1dGlvbih0aGlzLCAnbWljcm9hcHBzLWNsb3VkZnJvbnQnLCB7XG4gICAgICBjb21tZW50OiBgJHthc3NldE5hbWVSb290fSR7YXNzZXROYW1lU3VmZml4fWAsXG4gICAgICBkb21haW5OYW1lczogW2RvbWFpbk5hbWVFZGdlXSxcbiAgICAgIGNlcnRpZmljYXRlOiBjZXJ0RWRnZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMixcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICBjYWNoZVBvbGljeTogY2YuQ2FjaGVQb2xpY3kuQ0FDSElOR19ESVNBQkxFRCxcbiAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IGNmLk9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUixcbiAgICAgICAgb3JpZ2luOiBhcGlHd3lPcmlnaW4sXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIH0sXG4gICAgICBlbmFibGVJcHY2OiB0cnVlLFxuICAgICAgcHJpY2VDbGFzczogY2YuUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAsXG4gICAgICBlbmFibGVMb2dnaW5nOiB0cnVlLFxuICAgICAgbG9nQnVja2V0OiBwcm9wcy5zM0V4cG9ydHMuYnVja2V0TG9ncyxcbiAgICAgIGxvZ0ZpbGVQcmVmaXg6IGAke3JldmVyc2VEb21haW5OYW1lfS9jbG91ZGZyb250LXJhdy9gLFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgdGhpcy5fY2xvdWRGcm9udERpc3Ryby5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBBZGQgQmVoYXZpb3JzXG4gICAgLy9cbiAgICBjb25zdCBhcGlHd3lCZWhhdmlvcjogY2YuQWRkQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBjZi5PcmlnaW5SZXF1ZXN0UG9saWN5LkFMTF9WSUVXRVIsXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgfTtcbiAgICBjb25zdCBzM0JlaGF2aW9yOiBjZi5BZGRCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogY2YuT3JpZ2luUmVxdWVzdFBvbGljeS5DT1JTX1MzX09SSUdJTixcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaUd3eVZlcnNpb25Sb290QmVoYXZpb3I6IGNmLkFkZEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBjZi5BbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVQb2xpY3k6IGNmLkNhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gU2V0dXAgUm91dGVzXG4gICAgLy8gUHVsbCB0byB0aGUgQVBJIGZpcnN0LCB0aGVuIHB1bGwgdG8gUzMgaWYgaXQgY29udGFpbnMgL3N0YXRpYy9cbiAgICAvLyBQdWxsIGFueXRoaW5nIHVuZGVyIC9hcHBOYW1lL3gueS56LyBmb2xkZXIgd2l0aCAnLicgaW4gZmlsZSBuYW1lIHRvIFMzXG4gICAgLy8gTGV0IGV2ZXJ5dGhpbmcgZWxzZSBmYWxsIHRocm91Z2ggdG8gdGhlIEFQSSBHYXRld2F5XG4gICAgLy9cbiAgICB0aGlzLl9jbG91ZEZyb250RGlzdHJvLmFkZEJlaGF2aW9yKCcvKi8qL2FwaS8qJywgYXBpR3d5T3JpZ2luLCBhcGlHd3lCZWhhdmlvcik7XG4gICAgdGhpcy5fY2xvdWRGcm9udERpc3Ryby5hZGRCZWhhdmlvcignLyovKi9zdGF0aWMvKicsIHMzRXhwb3J0cy5idWNrZXRBcHBzT3JpZ2luLCBzM0JlaGF2aW9yKTtcbiAgICB0aGlzLl9jbG91ZEZyb250RGlzdHJvLmFkZEJlaGF2aW9yKCcvKi8qLyouKicsIHMzRXhwb3J0cy5idWNrZXRBcHBzT3JpZ2luLCBzM0JlaGF2aW9yKTtcbiAgICB0aGlzLl9jbG91ZEZyb250RGlzdHJvLmFkZEJlaGF2aW9yKCcvKi8qLycsIGFwaUd3eU9yaWdpbiwgYXBpR3d5VmVyc2lvblJvb3RCZWhhdmlvcik7XG5cbiAgICAvL1xuICAgIC8vIENyZWF0ZSB0aGUgZWRnZSBuYW1lIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cm9cbiAgICAvL1xuXG4gICAgY29uc3Qgem9uZSA9IHI1My5Ib3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCAnbWljcm9hcHBzLXpvbmUnLCB7XG4gICAgICB6b25lTmFtZTogcjUzWm9uZU5hbWUsXG4gICAgICBob3N0ZWRab25lSWQ6IHI1M1pvbmVJRCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJyQXBwc0VkZ2UgPSBuZXcgcjUzLlJlY29yZFNldCh0aGlzLCAnbWljcm9hcHBzLWVkZ2UtYXJlY29yZCcsIHtcbiAgICAgIHJlY29yZE5hbWU6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgcmVjb3JkVHlwZTogcjUzLlJlY29yZFR5cGUuQSxcbiAgICAgIHRhcmdldDogcjUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IHI1M3RhcmdldHMuQ2xvdWRGcm9udFRhcmdldCh0aGlzLl9jbG91ZEZyb250RGlzdHJvKSksXG4gICAgICB6b25lLFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcnJBcHBzRWRnZS5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuICB9XG59XG4iXX0=
180
+ _a = JSII_RTTI_SYMBOL_1;
181
+ MicroAppsCF[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroAppsCF", version: "0.0.29" };
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzQ0YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWljcm9BcHBzQ0YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFBMEM7QUFHMUMsOENBQThDO0FBQzlDLDZEQUE2RDtBQUM3RCw0Q0FBNEM7QUFDNUMsMkRBQTJEO0FBRTNELHFDQUFxQztBQUNyQyx5REFBc0Q7Ozs7QUF5RHRELE1BQWEsV0FBWSxTQUFRLEdBQUcsQ0FBQyxTQUFTOzs7Ozs7SUF5RjVDLFlBQVksS0FBb0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsSUFDRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDO1lBQ25FLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsRUFDbkU7WUFDQSxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7U0FDOUY7UUFFRCxNQUFNLEVBQ0osY0FBYyxFQUNkLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsYUFBYSxFQUNiLFFBQVEsRUFDUixhQUFhLEVBQ2IsZUFBZSxFQUNmLE9BQU8sRUFDUCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLGNBQWMsR0FDZixHQUFHLEtBQUssQ0FBQztRQUVWLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRTtZQUN4RSxhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxFQUFFO1FBQ0YsbUNBQW1DO1FBQ25DLEVBQUU7UUFDRixJQUFJ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Q0FBQzs7QUF0Rkgsa0NBNkxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9zaXggYXMgcG9zaXhQYXRoIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBhcGlnd3kgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mic7XG5pbXBvcnQgKiBhcyBhY20gZnJvbSAnQGF3cy1jZGsvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBjZiBmcm9tICdAYXdzLWNkay9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjZm9yaWdpbnMgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3VkZnJvbnQtb3JpZ2lucyc7XG5pbXBvcnQgKiBhcyByNTMgZnJvbSAnQGF3cy1jZGsvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgcjUzdGFyZ2V0cyBmcm9tICdAYXdzLWNkay9hd3Mtcm91dGU1My10YXJnZXRzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ0Bhd3MtY2RrL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyByZXZlcnNlRG9tYWluIH0gZnJvbSAnLi91dGlscy9SZXZlcnNlRG9tYWluJztcblxuZXhwb3J0IGludGVyZmFjZSBJTWljcm9BcHBzQ0Yge1xuICByZWFkb25seSBjbG91ZEZyb250RGlzdHJvOiBjZi5EaXN0cmlidXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBzQ0ZQcm9wcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0QXBwc09yaWdpbjogY2ZvcmlnaW5zLlMzT3JpZ2luO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGJ1Y2tldExvZ3M/OiBzMy5JQnVja2V0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBkb21haW5OYW1lRWRnZT86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBkb21haW5OYW1lT3JpZ2luPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGh0dHBBcGk6IGFwaWd3eS5IdHRwQXBpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVN1ZmZpeD86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGNlcnRFZGdlPzogYWNtLklDZXJ0aWZpY2F0ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHI1M1pvbmU/OiByNTMuSUhvc3RlZFpvbmU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJvb3RQYXRoUHJlZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFQSU9yaWdpblBvbGljeU9wdGlvbnMge1xuICByZWFkb25seSBhc3NldE5hbWVSb290Pzogc3RyaW5nO1xuICByZWFkb25seSBhc3NldE5hbWVTdWZmaXg/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZFJvdXRlc09wdGlvbnMge1xuICByZWFkb25seSBhcGlHd3lPcmlnaW46IGNmLklPcmlnaW47XG4gIHJlYWRvbmx5IGJ1Y2tldEFwcHNPcmlnaW46IGNmb3JpZ2lucy5TM09yaWdpbjtcbiAgcmVhZG9ubHkgZGlzdHJvOiBjZi5EaXN0cmlidXRpb247XG4gIHJlYWRvbmx5IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k6IGNmLklPcmlnaW5SZXF1ZXN0UG9saWN5O1xuICByZWFkb25seSByb290UGF0aFByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1pY3JvQXBwc0NGIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCBpbXBsZW1lbnRzIElNaWNyb0FwcHNDRiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlQVBJT3JpZ2luUG9saWN5KFxuICAgIHNjb3BlOiBjZGsuQ29uc3RydWN0LFxuICAgIHByb3BzOiBDcmVhdGVBUElPcmlnaW5Qb2xpY3lPcHRpb25zLFxuICApOiBjZi5JT3JpZ2luUmVxdWVzdFBvbGljeSB7XG4gICAgY29uc3QgeyBhc3NldE5hbWVSb290LCBhc3NldE5hbWVTdWZmaXgsIGRvbWFpbk5hbWVFZGdlIH0gPSBwcm9wcztcblxuICAgIGxldCBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5OiBjZi5JT3JpZ2luUmVxdWVzdFBvbGljeSA9IGNmLk9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUjtcbiAgICBpZiAoZG9tYWluTmFtZUVkZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gV2hlbiBub3QgdXNpbmcgYSBjdXN0b20gZG9tYWluIG5hbWUgd2UgbXVzdCBsaW1pdCBkb3duIHRoZSBvcmlnaW4gcG9saWN5IHRvXG4gICAgICAvLyBwcmV2ZW50IGl0IGZyb20gcGFzc2luZyB0aGUgSG9zdCBoZWFkZXIgKGRpc3RyaWJ1dGlvbl9pZC5jbG91ZGZyb250Lm5ldCkgdG9cbiAgICAgIC8vIGFwaWd3eSB3aGljaCB3aWxsIHRoZW4gcmVqZWN0IGl0IHdpdGggYSA0MDMgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYXRjaCB0aGVcbiAgICAgIC8vIGV4ZWN1dGUtYXBpIG5hbWUgdGhhdCBhcGlnd3kgaXMgZXhwZWN0aW5nLlxuICAgICAgLy9cbiAgICAgIC8vIDIwMjEtMTItMjggLSBUaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgbmFtZSBnZW5lcmF0aW9uIHRoYXQgY2F1c2VzIHRoZSBzYW1lIGFzc2V0XG4gICAgICAvLyBpbiBkaWZmZXJlbnQgc3RhY2tzIHRvIGhhdmUgdGhlIHNhbWUgZ2VuZXJhdGVkIG5hbWUuICBXZSBoYXZlIHRvIG1ha2UgdGhlIGlkXG4gICAgICAvLyBpbiBhbGwgY2FzZXMgdG8gZW5zdXJlIHRoZSBnZW5lcmF0ZWQgbmFtZSBpcyB1bmlxdWUuXG4gICAgICBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5ID0gbmV3IGNmLk9yaWdpblJlcXVlc3RQb2xpY3koXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBgYXBpZ3d5LW9yaWdpbi1wb2xpY3ktJHtjZGsuU3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWVudDogYXNzZXROYW1lUm9vdCA/IGAke2Fzc2V0TmFtZVJvb3R9LWFwaWd3eSR7YXNzZXROYW1lU3VmZml4fWAgOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5TmFtZTogYXNzZXROYW1lUm9vdFxuICAgICAgICAgICAgPyBgJHthc3NldE5hbWVSb290fS1hcGlnd3kke2Fzc2V0TmFtZVN1ZmZpeH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb29raWVCZWhhdmlvcjogY2YuT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IGNmLk9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBjZi5PcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KCd1c2VyLWFnZW50JywgJ3JlZmVyZXInKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHN0YXRpYyBhZGRSb3V0ZXMoX3Njb3BlOiBjZGsuQ29uc3RydWN0LCBwcm9wczogQWRkUm91dGVzT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGFwaUd3eU9yaWdpbixcbiAgICAgIGJ1Y2tldEFwcHNPcmlnaW4sXG4gICAgICBkaXN0cm8sXG4gICAgICBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgICAgcm9vdFBhdGhQcmVmaXggPSAnJyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvL1xuICAgIC8vIEFkZCBCZWhhdmlvcnNcbiAgICAvL1xuICAgIGNvbnN0IHMzQmVoYXZpb3JPcHRpb25zOiBjZi5BZGRCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogY2YuT3JpZ2luUmVxdWVzdFBvbGljeS5DT1JTX1MzX09SSUdJTixcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaUd3eUJlaGF2aW9yT3B0aW9uczogY2YuQWRkQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgIC8vIFRPRE86IENhY2hpbmcgbmVlZHMgdG8gYmUgc2V0IGJ5IHRoZSBhcHAgcmVzcG9uc2VcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNmLlZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIEFsbCBzdGF0aWMgYXNzZXRzIGFyZSBhc3N1bWVkIHRvIGhhdmUgYSBkb3QgaW4gdGhlbVxuICAgIC8vXG4gICAgZGlzdHJvLmFkZEJlaGF2aW9yKFxuICAgICAgcG9zaXhQYXRoLmpvaW4ocm9vdFBhdGhQcmVmaXgsICcvKi8qLyouKicpLFxuICAgICAgYnVja2V0QXBwc09yaWdpbixcbiAgICAgIHMzQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgdGhhdCBpc24ndCBhIHN0YXRpYyBhc3NldCBpcyBnb2luZyB0byBBUEkgR2F0ZXdheVxuICAgIC8vIFRoZXJlIGlzIG5vIHRyYWlsaW5nIHNsYXNoIGJlY2F1c2UgU2VydmVybGVzcyBOZXh0LmpzIHdhbnRzXG4gICAgLy8gZ28gbG9hZCBwYWdlcyBhdCAvcmVsZWFzZS8wLjAuMyAod2l0aCBubyB0cmFpbGluZyBzbGFzaCkuXG4gICAgLy9cbiAgICBkaXN0cm8uYWRkQmVoYXZpb3IocG9zaXhQYXRoLmpvaW4ocm9vdFBhdGhQcmVmaXgsICcvKicpLCBhcGlHd3lPcmlnaW4sIGFwaUd3eUJlaGF2aW9yT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIF9jbG91ZEZyb250RGlzdHJvOiBjZi5EaXN0cmlidXRpb247XG4gIHB1YmxpYyBnZXQgY2xvdWRGcm9udERpc3RybygpOiBjZi5EaXN0cmlidXRpb24ge1xuICAgIHJldHVybiB0aGlzLl9jbG91ZEZyb250RGlzdHJvO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTWljcm9BcHBzQ0ZQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wcyBtdXN0IGJlIHNldCcpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9wcy5yNTNab25lID09PSB1bmRlZmluZWQgJiYgcHJvcHMuZG9tYWluTmFtZUVkZ2UgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgIChwcm9wcy5yNTNab25lICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZG9tYWluTmFtZUVkZ2UgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSWYgZWl0aGVyIG9mIHI1M1pvbmUgb3IgZG9tYWluTmFtZUVkZ2UgYXJlIHNldCB0aGVuIHRoZSBvdGhlciBtdXN0IGJlIHNldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGRvbWFpbk5hbWVFZGdlLFxuICAgICAgZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIGh0dHBBcGksXG4gICAgICByZW1vdmFsUG9saWN5LFxuICAgICAgY2VydEVkZ2UsXG4gICAgICBhc3NldE5hbWVSb290LFxuICAgICAgYXNzZXROYW1lU3VmZml4LFxuICAgICAgcjUzWm9uZSxcbiAgICAgIGJ1Y2tldExvZ3MsXG4gICAgICBidWNrZXRBcHBzT3JpZ2luLFxuICAgICAgcm9vdFBhdGhQcmVmaXgsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeSA9IE1pY3JvQXBwc0NGLmNyZWF0ZUFQSU9yaWdpblBvbGljeSh0aGlzLCB7XG4gICAgICBhc3NldE5hbWVSb290LFxuICAgICAgYXNzZXROYW1lU3VmZml4LFxuICAgICAgZG9tYWluTmFtZUVkZ2UsXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIERldGVybWluZSBVUkwgb2YgdGhlIG9yaWdpbiBGUUROXG4gICAgLy9cbiAgICBsZXQgaHR0cE9yaWdpbkZRRE46IHN0cmluZyA9ICdpbnZhbGlkLnB3cmRydnIuY29tJztcbiAgICBpZiAoZG9tYWluTmFtZU9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBodHRwT3JpZ2luRlFETiA9IGRvbWFpbk5hbWVPcmlnaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBPcmlnaW5GUUROID0gYCR7aHR0cEFwaS5hcGlJZH0uZXhlY3V0ZS1hcGkuJHtjZGsuQXdzLlJFR0lPTn0uYW1hem9uYXdzLmNvbWA7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBDbG91ZEZyb250IERpc3Ryb1xuICAgIC8vXG4gICAgY29uc3QgYXBpR3d5T3JpZ2luID0gbmV3IGNmb3JpZ2lucy5IdHRwT3JpZ2luKGh0dHBPcmlnaW5GUUROLCB7XG4gICAgICBwcm90b2NvbFBvbGljeTogY2YuT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICAgIG9yaWdpblNzbFByb3RvY29sczogW2NmLk9yaWdpblNzbFBvbGljeS5UTFNfVjFfMl0sXG4gICAgfSk7XG4gICAgdGhpcy5fY2xvdWRGcm9udERpc3RybyA9IG5ldyBjZi5EaXN0cmlidXRpb24odGhpcywgJ2NmdCcsIHtcbiAgICAgIGNvbW1lbnQ6IGFzc2V0TmFtZVJvb3QgPyBgJHthc3NldE5hbWVSb290fSR7YXNzZXROYW1lU3VmZml4fWAgOiBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVzOiBkb21haW5OYW1lRWRnZSAhPT0gdW5kZWZpbmVkID8gW2RvbWFpbk5hbWVFZGdlXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNlcnRpZmljYXRlOiBjZXJ0RWRnZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMixcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICBjYWNoZVBvbGljeTogY2YuQ2FjaGVQb2xpY3kuQ0FDSElOR19ESVNBQkxFRCxcbiAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3ksXG4gICAgICAgIG9yaWdpbjogYXBpR3d5T3JpZ2luLFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICB9LFxuICAgICAgZW5hYmxlSXB2NjogdHJ1ZSxcbiAgICAgIHByaWNlQ2xhc3M6IGNmLlByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLFxuICAgICAgbG9nQnVja2V0OiBidWNrZXRMb2dzLFxuICAgICAgbG9nRmlsZVByZWZpeDogcHJvcHMuZG9tYWluTmFtZUVkZ2VcbiAgICAgICAgPyBgJHtyZXZlcnNlRG9tYWluKHByb3BzLmRvbWFpbk5hbWVFZGdlKX0vY2xvdWRmcm9udC1yYXcvYFxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBpZiAocmVtb3ZhbFBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jbG91ZEZyb250RGlzdHJvLmFwcGx5UmVtb3ZhbFBvbGljeShyZW1vdmFsUG9saWN5KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcm91dGVzIHRvIHRoZSBDbG91ZEZyb250IERpc3RyaWJ1dGlvblxuICAgIE1pY3JvQXBwc0NGLmFkZFJvdXRlcyhzY29wZSwge1xuICAgICAgYXBpR3d5T3JpZ2luLFxuICAgICAgYnVja2V0QXBwc09yaWdpbixcbiAgICAgIGRpc3RybzogdGhpcy5fY2xvdWRGcm9udERpc3RybyxcbiAgICAgIGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k6IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3ksXG4gICAgICByb290UGF0aFByZWZpeCxcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy8gQ3JlYXRlIHRoZSBlZGdlIG5hbWUgZm9yIHRoZSBDbG91ZEZyb250IGRpc3Ryb1xuICAgIC8vXG5cbiAgICBpZiAocjUzWm9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByckFwcHNFZGdlID0gbmV3IHI1My5SZWNvcmRTZXQodGhpcywgJ2VkZ2UtYXJlY29yZCcsIHtcbiAgICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZUVkZ2UsXG4gICAgICAgIHJlY29yZFR5cGU6IHI1My5SZWNvcmRUeXBlLkEsXG4gICAgICAgIHRhcmdldDogcjUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IHI1M3RhcmdldHMuQ2xvdWRGcm9udFRhcmdldCh0aGlzLl9jbG91ZEZyb250RGlzdHJvKSksXG4gICAgICAgIHpvbmU6IHI1M1pvbmUsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZW1vdmFsUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnJBcHBzRWRnZS5hcHBseVJlbW92YWxQb2xpY3kocmVtb3ZhbFBvbGljeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -2,42 +2,139 @@ import * as cf from '@aws-cdk/aws-cloudfront';
2
2
  import * as cforigins from '@aws-cdk/aws-cloudfront-origins';
3
3
  import * as s3 from '@aws-cdk/aws-s3';
4
4
  import * as cdk from '@aws-cdk/core';
5
- export interface IMicroAppsS3Exports {
5
+ /**
6
+ * @stability stable
7
+ */
8
+ export interface IMicroAppsS3 {
9
+ /**
10
+ * S3 bucket for deployed applications.
11
+ *
12
+ * @stability stable
13
+ */
6
14
  readonly bucketApps: s3.IBucket;
7
- readonly bucketAppsName: string;
15
+ /**
16
+ * CloudFront Origin Access Identity for the deployed applications bucket.
17
+ *
18
+ * @stability stable
19
+ */
8
20
  readonly bucketAppsOAI: cf.OriginAccessIdentity;
21
+ /**
22
+ * CloudFront Origin for the deployed applications bucket.
23
+ *
24
+ * @stability stable
25
+ */
9
26
  readonly bucketAppsOrigin: cforigins.S3Origin;
27
+ /**
28
+ * S3 bucket for staged applications (prior to deploy).
29
+ *
30
+ * @stability stable
31
+ */
10
32
  readonly bucketAppsStaging: s3.IBucket;
11
- readonly bucketAppsStagingName: string;
33
+ /**
34
+ * S3 bucket for CloudFront logs.
35
+ *
36
+ * @stability stable
37
+ */
12
38
  readonly bucketLogs: s3.IBucket;
13
39
  }
14
- interface MicroAppsS3Props extends cdk.ResourceProps {
40
+ /**
41
+ * @stability stable
42
+ */
43
+ export interface MicroAppsS3Props {
15
44
  /**
16
- * Duration before stack is automatically deleted.
17
- * Requires that autoDeleteEverything be set to true.
45
+ * RemovalPolicy override for child resources.
18
46
  *
19
- * @default false
47
+ * Note: if set to DESTROY the S3 buckes will have `autoDeleteObjects` set to `true`
48
+ *
49
+ * @default - per resource default
50
+ * @stability stable
20
51
  */
21
- readonly autoDeleteEverything?: boolean;
22
- readonly reverseDomainName: string;
23
- readonly assetNameRoot: string;
24
- readonly assetNameSuffix: string;
52
+ readonly removalPolicy?: cdk.RemovalPolicy;
53
+ /**
54
+ * S3 deployed apps bucket name.
55
+ *
56
+ * @default auto-assigned
57
+ * @stability stable
58
+ */
59
+ readonly bucketAppsName?: string;
60
+ /**
61
+ * S3 staging apps bucket name.
62
+ *
63
+ * @default auto-assigned
64
+ * @stability stable
65
+ */
66
+ readonly bucketAppsStagingName?: string;
67
+ /**
68
+ * S3 logs bucket name.
69
+ *
70
+ * @default auto-assigned
71
+ * @stability stable
72
+ */
73
+ readonly bucketLogsName?: string;
74
+ /**
75
+ * Optional asset name root.
76
+ *
77
+ * @default - resource names auto assigned
78
+ * @stability stable
79
+ * @example
80
+ *
81
+ * microapps
82
+ */
83
+ readonly assetNameRoot?: string;
84
+ /**
85
+ * Optional asset name suffix.
86
+ *
87
+ * @default none
88
+ * @stability stable
89
+ * @example
90
+ *
91
+ * -dev-pr-12
92
+ */
93
+ readonly assetNameSuffix?: string;
25
94
  }
26
- export declare class MicroAppsS3 extends cdk.Construct implements IMicroAppsS3Exports {
95
+ /**
96
+ * @stability stable
97
+ */
98
+ export declare class MicroAppsS3 extends cdk.Construct implements IMicroAppsS3 {
27
99
  private _bucketApps;
100
+ /**
101
+ * S3 bucket for deployed applications.
102
+ *
103
+ * @stability stable
104
+ */
28
105
  get bucketApps(): s3.IBucket;
29
- private _bucketAppsName;
30
- get bucketAppsName(): string;
31
106
  private _bucketAppsOAI;
107
+ /**
108
+ * CloudFront Origin Access Identity for the deployed applications bucket.
109
+ *
110
+ * @stability stable
111
+ */
32
112
  get bucketAppsOAI(): cf.OriginAccessIdentity;
33
113
  private _bucketAppsOrigin;
114
+ /**
115
+ * CloudFront Origin for the deployed applications bucket.
116
+ *
117
+ * @stability stable
118
+ */
34
119
  get bucketAppsOrigin(): cforigins.S3Origin;
35
120
  private _bucketAppsStaging;
121
+ /**
122
+ * S3 bucket for staged applications (prior to deploy).
123
+ *
124
+ * @stability stable
125
+ */
36
126
  get bucketAppsStaging(): s3.IBucket;
37
- private _bucketAppsStagingName;
38
- get bucketAppsStagingName(): string;
39
127
  private _bucketLogs;
128
+ /**
129
+ * S3 bucket for CloudFront logs.
130
+ *
131
+ * @stability stable
132
+ */
40
133
  get bucketLogs(): s3.IBucket;
134
+ /**
135
+ * MicroApps - Create just S3 resources.
136
+ *
137
+ * @stability stable
138
+ */
41
139
  constructor(scope: cdk.Construct, id: string, props?: MicroAppsS3Props);
42
140
  }
43
- export {};
@@ -1,80 +1,104 @@
1
1
  "use strict";
2
+ var _a;
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
4
  exports.MicroAppsS3 = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
4
6
  const cf = require("@aws-cdk/aws-cloudfront");
5
7
  const cforigins = require("@aws-cdk/aws-cloudfront-origins");
6
8
  const s3 = require("@aws-cdk/aws-s3");
7
9
  const cdk = require("@aws-cdk/core");
10
+ /**
11
+ * @stability stable
12
+ */
8
13
  class MicroAppsS3 extends cdk.Construct {
14
+ /**
15
+ * MicroApps - Create just S3 resources.
16
+ *
17
+ * @stability stable
18
+ */
9
19
  constructor(scope, id, props) {
10
20
  super(scope, id);
11
21
  if (props === undefined) {
12
22
  throw new Error('props must be set');
13
23
  }
14
- const { autoDeleteEverything = false, reverseDomainName, assetNameRoot, assetNameSuffix, } = props;
15
- // Use Auto-Delete S3Bucket for PRs
16
- this._bucketAppsName = `${reverseDomainName}-${assetNameRoot}${assetNameSuffix}`;
17
- this._bucketAppsStagingName = `${reverseDomainName}-${assetNameRoot}-staging${assetNameSuffix}`;
18
- const s3RemovalPolicy = autoDeleteEverything
19
- ? cdk.RemovalPolicy.DESTROY
20
- : cdk.RemovalPolicy.RETAIN;
21
- const s3AutoDeleteItems = autoDeleteEverything;
24
+ const { removalPolicy, assetNameRoot, assetNameSuffix } = props;
25
+ // Use Auto-Delete S3Bucket if removal policy is DESTROY
26
+ const s3AutoDeleteItems = removalPolicy === cdk.RemovalPolicy.DESTROY;
22
27
  //
23
28
  // S3 Bucket for Logging - Usable by many stacks
24
29
  //
25
- this._bucketLogs = new s3.Bucket(this, 'microapps-logs', {
26
- bucketName: `${reverseDomainName}-${assetNameRoot}-logs${assetNameSuffix}`,
30
+ this._bucketLogs = new s3.Bucket(this, 'logs', {
31
+ bucketName: props.bucketLogsName,
27
32
  autoDeleteObjects: s3AutoDeleteItems,
28
- removalPolicy: s3RemovalPolicy,
33
+ removalPolicy,
29
34
  });
30
35
  //
31
36
  // S3 Buckets for Apps
32
37
  //
33
- this._bucketApps = new s3.Bucket(this, 'microapps-apps', {
34
- bucketName: this._bucketAppsName,
38
+ this._bucketApps = new s3.Bucket(this, 'apps', {
39
+ bucketName: props.bucketAppsName,
35
40
  autoDeleteObjects: s3AutoDeleteItems,
36
- removalPolicy: s3RemovalPolicy,
41
+ removalPolicy,
37
42
  });
38
- this._bucketAppsStaging = new s3.Bucket(this, 'microapps-apps-staging', {
39
- bucketName: this._bucketAppsStagingName,
43
+ this._bucketAppsStaging = new s3.Bucket(this, 'staging', {
44
+ bucketName: props.bucketAppsStagingName,
40
45
  autoDeleteObjects: s3AutoDeleteItems,
41
- removalPolicy: s3RemovalPolicy,
46
+ removalPolicy,
42
47
  });
43
48
  // Create S3 Origin Identity
44
- this._bucketAppsOAI = new cf.OriginAccessIdentity(this, 'microapps-oai', {
45
- comment: `${assetNameRoot}${assetNameSuffix}`,
49
+ this._bucketAppsOAI = new cf.OriginAccessIdentity(this, 'oai', {
50
+ comment: assetNameRoot !== undefined ? `${assetNameRoot}${assetNameSuffix}` : undefined,
46
51
  });
47
- if (autoDeleteEverything) {
48
- this._bucketAppsOAI.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
52
+ if (removalPolicy !== undefined) {
53
+ this._bucketAppsOAI.applyRemovalPolicy(removalPolicy);
49
54
  }
50
- //
51
- // Add Origins
52
- //
55
+ // Add Origin for CloudFront
53
56
  this._bucketAppsOrigin = new cforigins.S3Origin(this._bucketApps, {
54
57
  originAccessIdentity: this.bucketAppsOAI,
55
58
  });
56
59
  }
60
+ /**
61
+ * S3 bucket for deployed applications.
62
+ *
63
+ * @stability stable
64
+ */
57
65
  get bucketApps() {
58
66
  return this._bucketApps;
59
67
  }
60
- get bucketAppsName() {
61
- return this._bucketAppsName;
62
- }
68
+ /**
69
+ * CloudFront Origin Access Identity for the deployed applications bucket.
70
+ *
71
+ * @stability stable
72
+ */
63
73
  get bucketAppsOAI() {
64
74
  return this._bucketAppsOAI;
65
75
  }
76
+ /**
77
+ * CloudFront Origin for the deployed applications bucket.
78
+ *
79
+ * @stability stable
80
+ */
66
81
  get bucketAppsOrigin() {
67
82
  return this._bucketAppsOrigin;
68
83
  }
84
+ /**
85
+ * S3 bucket for staged applications (prior to deploy).
86
+ *
87
+ * @stability stable
88
+ */
69
89
  get bucketAppsStaging() {
70
90
  return this._bucketAppsStaging;
71
91
  }
72
- get bucketAppsStagingName() {
73
- return this._bucketAppsStagingName;
74
- }
92
+ /**
93
+ * S3 bucket for CloudFront logs.
94
+ *
95
+ * @stability stable
96
+ */
75
97
  get bucketLogs() {
76
98
  return this._bucketLogs;
77
99
  }
78
100
  }
79
101
  exports.MicroAppsS3 = MicroAppsS3;
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzUzMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWljcm9BcHBzUzMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOENBQThDO0FBQzlDLDZEQUE2RDtBQUM3RCxzQ0FBc0M7QUFDdEMscUNBQXFDO0FBMkJyQyxNQUFhLFdBQVksU0FBUSxHQUFHLENBQUMsU0FBUztJQW9DNUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUF3QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEM7UUFFRCxNQUFNLEVBQ0osb0JBQW9CLEdBQUcsS0FBSyxFQUM1QixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGVBQWUsR0FDaEIsR0FBRyxLQUFLLENBQUM7UUFFVixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLGlCQUFpQixJQUFJLGFBQWEsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUNqRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxhQUFhLFdBQVcsZUFBZSxFQUFFLENBQUM7UUFFaEcsTUFBTSxlQUFlLEdBQUcsb0JBQW9CO1lBQzFDLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDM0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzdCLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7UUFFL0MsRUFBRTtRQUNGLGdEQUFnRDtRQUNoRCxFQUFFO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3ZELFVBQVUsRUFBRSxHQUFHLGlCQUFpQixJQUFJLGFBQWEsUUFBUSxlQUFlLEVBQUU7WUFDMUUsaUJBQWlCLEVBQUUsaUJBQWlCO1lBQ3BDLGFBQWEsRUFBRSxlQUFlO1NBQy9CLENBQUMsQ0FBQztRQUVILEVBQUU7UUFDRixzQkFBc0I7UUFDdEIsRUFBRTtRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUN2RCxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDaEMsaUJBQWlCLEVBQUUsaUJBQWlCO1lBQ3BDLGFBQWEsRUFBRSxlQUFlO1NBQy9CLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO1lBQ3RFLFVBQVUsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQ3ZDLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxhQUFhLEVBQUUsZUFBZTtTQUMvQixDQUFDLENBQUM7UUFFSCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3ZFLE9BQU8sRUFBRSxHQUFHLGFBQWEsR0FBRyxlQUFlLEVBQUU7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxvQkFBb0IsRUFBRTtZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkU7UUFFRCxFQUFFO1FBQ0YsY0FBYztRQUNkLEVBQUU7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQTlGRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFHRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFHRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFHRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBR0QsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUdELElBQVcscUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7SUFHRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0ErREY7QUFqR0Qsa0NBaUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2YgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgY2ZvcmlnaW5zIGZyb20gJ0Bhd3MtY2RrL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnQGF3cy1jZGsvYXdzLXMzJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdAYXdzLWNkay9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBJTWljcm9BcHBzUzNFeHBvcnRzIHtcbiAgcmVhZG9ubHkgYnVja2V0QXBwczogczMuSUJ1Y2tldDtcbiAgcmVhZG9ubHkgYnVja2V0QXBwc05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYnVja2V0QXBwc09BSTogY2YuT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG4gIHJlYWRvbmx5IGJ1Y2tldEFwcHNPcmlnaW46IGNmb3JpZ2lucy5TM09yaWdpbjtcbiAgcmVhZG9ubHkgYnVja2V0QXBwc1N0YWdpbmc6IHMzLklCdWNrZXQ7XG4gIHJlYWRvbmx5IGJ1Y2tldEFwcHNTdGFnaW5nTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBidWNrZXRMb2dzOiBzMy5JQnVja2V0O1xufVxuXG5pbnRlcmZhY2UgTWljcm9BcHBzUzNQcm9wcyBleHRlbmRzIGNkay5SZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIER1cmF0aW9uIGJlZm9yZSBzdGFjayBpcyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuXG4gICAqIFJlcXVpcmVzIHRoYXQgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcgYmUgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlRXZlcnl0aGluZz86IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgcmV2ZXJzZURvbWFpbk5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBhc3NldE5hbWVSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFzc2V0TmFtZVN1ZmZpeDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWljcm9BcHBzUzMgZXh0ZW5kcyBjZGsuQ29uc3RydWN0IGltcGxlbWVudHMgSU1pY3JvQXBwc1MzRXhwb3J0cyB7XG4gIHByaXZhdGUgX2J1Y2tldEFwcHM6IHMzLklCdWNrZXQ7XG4gIHB1YmxpYyBnZXQgYnVja2V0QXBwcygpOiBzMy5JQnVja2V0IHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0QXBwcztcbiAgfVxuXG4gIHByaXZhdGUgX2J1Y2tldEFwcHNOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgYnVja2V0QXBwc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0QXBwc05hbWU7XG4gIH1cblxuICBwcml2YXRlIF9idWNrZXRBcHBzT0FJOiBjZi5PcmlnaW5BY2Nlc3NJZGVudGl0eTtcbiAgcHVibGljIGdldCBidWNrZXRBcHBzT0FJKCk6IGNmLk9yaWdpbkFjY2Vzc0lkZW50aXR5IHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0QXBwc09BSTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1Y2tldEFwcHNPcmlnaW46IGNmb3JpZ2lucy5TM09yaWdpbjtcbiAgcHVibGljIGdldCBidWNrZXRBcHBzT3JpZ2luKCk6IGNmb3JpZ2lucy5TM09yaWdpbiB7XG4gICAgcmV0dXJuIHRoaXMuX2J1Y2tldEFwcHNPcmlnaW47XG4gIH1cblxuICBwcml2YXRlIF9idWNrZXRBcHBzU3RhZ2luZzogczMuSUJ1Y2tldDtcbiAgcHVibGljIGdldCBidWNrZXRBcHBzU3RhZ2luZygpOiBzMy5JQnVja2V0IHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0QXBwc1N0YWdpbmc7XG4gIH1cblxuICBwcml2YXRlIF9idWNrZXRBcHBzU3RhZ2luZ05hbWU6IHN0cmluZztcbiAgcHVibGljIGdldCBidWNrZXRBcHBzU3RhZ2luZ05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0QXBwc1N0YWdpbmdOYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVja2V0TG9nczogczMuSUJ1Y2tldDtcbiAgcHVibGljIGdldCBidWNrZXRMb2dzKCk6IHMzLklCdWNrZXQge1xuICAgIHJldHVybiB0aGlzLl9idWNrZXRMb2dzO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNkay5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTWljcm9BcHBzUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wcyBtdXN0IGJlIHNldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGF1dG9EZWxldGVFdmVyeXRoaW5nID0gZmFsc2UsXG4gICAgICByZXZlcnNlRG9tYWluTmFtZSxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gVXNlIEF1dG8tRGVsZXRlIFMzQnVja2V0IGZvciBQUnNcbiAgICB0aGlzLl9idWNrZXRBcHBzTmFtZSA9IGAke3JldmVyc2VEb21haW5OYW1lfS0ke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YDtcbiAgICB0aGlzLl9idWNrZXRBcHBzU3RhZ2luZ05hbWUgPSBgJHtyZXZlcnNlRG9tYWluTmFtZX0tJHthc3NldE5hbWVSb290fS1zdGFnaW5nJHthc3NldE5hbWVTdWZmaXh9YDtcblxuICAgIGNvbnN0IHMzUmVtb3ZhbFBvbGljeSA9IGF1dG9EZWxldGVFdmVyeXRoaW5nXG4gICAgICA/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICAgIDogY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOO1xuICAgIGNvbnN0IHMzQXV0b0RlbGV0ZUl0ZW1zID0gYXV0b0RlbGV0ZUV2ZXJ5dGhpbmc7XG5cbiAgICAvL1xuICAgIC8vIFMzIEJ1Y2tldCBmb3IgTG9nZ2luZyAtIFVzYWJsZSBieSBtYW55IHN0YWNrc1xuICAgIC8vXG4gICAgdGhpcy5fYnVja2V0TG9ncyA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ21pY3JvYXBwcy1sb2dzJywge1xuICAgICAgYnVja2V0TmFtZTogYCR7cmV2ZXJzZURvbWFpbk5hbWV9LSR7YXNzZXROYW1lUm9vdH0tbG9ncyR7YXNzZXROYW1lU3VmZml4fWAsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogczNBdXRvRGVsZXRlSXRlbXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBzM1JlbW92YWxQb2xpY3ksXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIFMzIEJ1Y2tldHMgZm9yIEFwcHNcbiAgICAvL1xuICAgIHRoaXMuX2J1Y2tldEFwcHMgPSBuZXcgczMuQnVja2V0KHRoaXMsICdtaWNyb2FwcHMtYXBwcycsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuX2J1Y2tldEFwcHNOYW1lLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHMzQXV0b0RlbGV0ZUl0ZW1zLFxuICAgICAgcmVtb3ZhbFBvbGljeTogczNSZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuICAgIHRoaXMuX2J1Y2tldEFwcHNTdGFnaW5nID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnbWljcm9hcHBzLWFwcHMtc3RhZ2luZycsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuX2J1Y2tldEFwcHNTdGFnaW5nTmFtZSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiBzM0F1dG9EZWxldGVJdGVtcyxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHMzUmVtb3ZhbFBvbGljeSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBTMyBPcmlnaW4gSWRlbnRpdHlcbiAgICB0aGlzLl9idWNrZXRBcHBzT0FJID0gbmV3IGNmLk9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsICdtaWNyb2FwcHMtb2FpJywge1xuICAgICAgY29tbWVudDogYCR7YXNzZXROYW1lUm9vdH0ke2Fzc2V0TmFtZVN1ZmZpeH1gLFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgdGhpcy5fYnVja2V0QXBwc09BSS5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBBZGQgT3JpZ2luc1xuICAgIC8vXG4gICAgdGhpcy5fYnVja2V0QXBwc09yaWdpbiA9IG5ldyBjZm9yaWdpbnMuUzNPcmlnaW4odGhpcy5fYnVja2V0QXBwcywge1xuICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuYnVja2V0QXBwc09BSSxcbiAgICB9KTtcbiAgfVxufVxuIl19
102
+ _a = JSII_RTTI_SYMBOL_1;
103
+ MicroAppsS3[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroAppsS3", version: "0.0.29" };
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzUzMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWljcm9BcHBzUzMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBOEM7QUFDOUMsNkRBQTZEO0FBQzdELHNDQUFzQztBQUN0QyxxQ0FBcUM7Ozs7QUF1Q3JDLE1BQWEsV0FBWSxTQUFRLEdBQUcsQ0FBQyxTQUFTOzs7Ozs7SUEyQjVDLFlBQVksS0FBb0IsRUFBRSxFQUFVLEVBQUUsS0FBd0I7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsTUFBTSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRWhFLHdEQUF3RDtRQUN4RCxNQUFNLGlCQUFpQixHQUFHLGFBQWEsS0FBSyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUV0RSxFQUFFO1FBQ0YsZ0RBQWdEO1FBQ2hELEVBQUU7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQzdDLFVBQVUsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNoQyxpQkFBaUIsRUFBRSxpQkFBaUI7WUFDcEMsYUFBYTtTQUNkLENBQUMsQ0FBQztRQUVILEVBQUU7UUFDRixzQkFBc0I7UUFDdEIsRUFBRTtRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDN0MsVUFBVSxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ2hDLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3ZELFVBQVUsRUFBRSxLQUFLLENBQUMscUJBQXFCO1lBQ3ZDLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUM3RCxPQUFPLEVBQUUsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDeEYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdkQ7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7OztJQXhFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Ozs7OztJQUdELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQzs7Ozs7O0lBR0QsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQzs7Ozs7O0lBR0QsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQzs7Ozs7O0lBR0QsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDOztBQXhCSCxrQ0EyRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZiBmcm9tICdAYXdzLWNkay9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjZm9yaWdpbnMgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3VkZnJvbnQtb3JpZ2lucyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdAYXdzLWNkay9hd3MtczMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNTMyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGJ1Y2tldEFwcHM6IHMzLklCdWNrZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWNrZXRBcHBzT0FJOiBjZi5PcmlnaW5BY2Nlc3NJZGVudGl0eTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0QXBwc09yaWdpbjogY2ZvcmlnaW5zLlMzT3JpZ2luO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWNrZXRBcHBzU3RhZ2luZzogczMuSUJ1Y2tldDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWNrZXRMb2dzOiBzMy5JQnVja2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pY3JvQXBwc1MzUHJvcHMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWNrZXRBcHBzTmFtZT86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0QXBwc1N0YWdpbmdOYW1lPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0TG9nc05hbWU/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lUm9vdD86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWljcm9BcHBzUzMgZXh0ZW5kcyBjZGsuQ29uc3RydWN0IGltcGxlbWVudHMgSU1pY3JvQXBwc1MzIHtcbiAgcHJpdmF0ZSBfYnVja2V0QXBwczogczMuSUJ1Y2tldDtcbiAgcHVibGljIGdldCBidWNrZXRBcHBzKCk6IHMzLklCdWNrZXQge1xuICAgIHJldHVybiB0aGlzLl9idWNrZXRBcHBzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVja2V0QXBwc09BSTogY2YuT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG4gIHB1YmxpYyBnZXQgYnVja2V0QXBwc09BSSgpOiBjZi5PcmlnaW5BY2Nlc3NJZGVudGl0eSB7XG4gICAgcmV0dXJuIHRoaXMuX2J1Y2tldEFwcHNPQUk7XG4gIH1cblxuICBwcml2YXRlIF9idWNrZXRBcHBzT3JpZ2luOiBjZm9yaWdpbnMuUzNPcmlnaW47XG4gIHB1YmxpYyBnZXQgYnVja2V0QXBwc09yaWdpbigpOiBjZm9yaWdpbnMuUzNPcmlnaW4ge1xuICAgIHJldHVybiB0aGlzLl9idWNrZXRBcHBzT3JpZ2luO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVja2V0QXBwc1N0YWdpbmc6IHMzLklCdWNrZXQ7XG4gIHB1YmxpYyBnZXQgYnVja2V0QXBwc1N0YWdpbmcoKTogczMuSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuX2J1Y2tldEFwcHNTdGFnaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVja2V0TG9nczogczMuSUJ1Y2tldDtcbiAgcHVibGljIGdldCBidWNrZXRMb2dzKCk6IHMzLklCdWNrZXQge1xuICAgIHJldHVybiB0aGlzLl9idWNrZXRMb2dzO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBjb25zdHJ1Y3RvcihzY29wZTogY2RrLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBNaWNyb0FwcHNTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZW1vdmFsUG9saWN5LCBhc3NldE5hbWVSb290LCBhc3NldE5hbWVTdWZmaXggfSA9IHByb3BzO1xuXG4gICAgLy8gVXNlIEF1dG8tRGVsZXRlIFMzQnVja2V0IGlmIHJlbW92YWwgcG9saWN5IGlzIERFU1RST1lcbiAgICBjb25zdCBzM0F1dG9EZWxldGVJdGVtcyA9IHJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1k7XG5cbiAgICAvL1xuICAgIC8vIFMzIEJ1Y2tldCBmb3IgTG9nZ2luZyAtIFVzYWJsZSBieSBtYW55IHN0YWNrc1xuICAgIC8vXG4gICAgdGhpcy5fYnVja2V0TG9ncyA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ2xvZ3MnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXRMb2dzTmFtZSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiBzM0F1dG9EZWxldGVJdGVtcyxcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIFMzIEJ1Y2tldHMgZm9yIEFwcHNcbiAgICAvL1xuICAgIHRoaXMuX2J1Y2tldEFwcHMgPSBuZXcgczMuQnVja2V0KHRoaXMsICdhcHBzJywge1xuICAgICAgYnVja2V0TmFtZTogcHJvcHMuYnVja2V0QXBwc05hbWUsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogczNBdXRvRGVsZXRlSXRlbXMsXG4gICAgICByZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuICAgIHRoaXMuX2J1Y2tldEFwcHNTdGFnaW5nID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnc3RhZ2luZycsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldEFwcHNTdGFnaW5nTmFtZSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiBzM0F1dG9EZWxldGVJdGVtcyxcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgUzMgT3JpZ2luIElkZW50aXR5XG4gICAgdGhpcy5fYnVja2V0QXBwc09BSSA9IG5ldyBjZi5PcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLCAnb2FpJywge1xuICAgICAgY29tbWVudDogYXNzZXROYW1lUm9vdCAhPT0gdW5kZWZpbmVkID8gYCR7YXNzZXROYW1lUm9vdH0ke2Fzc2V0TmFtZVN1ZmZpeH1gIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGlmIChyZW1vdmFsUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2J1Y2tldEFwcHNPQUkuYXBwbHlSZW1vdmFsUG9saWN5KHJlbW92YWxQb2xpY3kpO1xuICAgIH1cblxuICAgIC8vIEFkZCBPcmlnaW4gZm9yIENsb3VkRnJvbnRcbiAgICB0aGlzLl9idWNrZXRBcHBzT3JpZ2luID0gbmV3IGNmb3JpZ2lucy5TM09yaWdpbih0aGlzLl9idWNrZXRBcHBzLCB7XG4gICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5idWNrZXRBcHBzT0FJLFxuICAgIH0pO1xuICB9XG59XG4iXX0=