@fjall/components-infrastructure 0.86.1 → 0.87.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/lib/app.d.ts +166 -6
- package/dist/lib/app.js +212 -20
- package/dist/lib/aspects/resourceInventory.d.ts +4 -4
- package/dist/lib/aspects/resourceInventory.js +3 -3
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/identityCenter.js +1 -5
- package/dist/lib/config/aws/organisation.js +1 -4
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +7 -1
- package/dist/lib/patterns/aws/buildkite.js +3 -2
- package/dist/lib/patterns/aws/cdn.d.ts +164 -0
- package/dist/lib/patterns/aws/cdn.js +264 -0
- package/dist/lib/patterns/aws/compute.d.ts +278 -59
- package/dist/lib/patterns/aws/compute.js +384 -188
- package/dist/lib/patterns/aws/connections.d.ts +46 -0
- package/dist/lib/patterns/aws/connections.js +159 -0
- package/dist/lib/patterns/aws/database.d.ts +124 -11
- package/dist/lib/patterns/aws/database.js +188 -66
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +3 -0
- package/dist/lib/patterns/aws/index.js +4 -1
- package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
- package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
- package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
- package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
- package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/database.js +65 -0
- package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
- package/dist/lib/patterns/aws/interfaces/index.js +49 -0
- package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
- package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
- package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
- package/dist/lib/patterns/aws/messaging.d.ts +183 -0
- package/dist/lib/patterns/aws/messaging.js +239 -0
- package/dist/lib/patterns/aws/network.js +4 -4
- package/dist/lib/patterns/aws/pattern.d.ts +67 -0
- package/dist/lib/patterns/aws/pattern.js +69 -0
- package/dist/lib/patterns/aws/payload.d.ts +87 -0
- package/dist/lib/patterns/aws/payload.js +526 -0
- package/dist/lib/patterns/aws/storage.d.ts +127 -15
- package/dist/lib/patterns/aws/storage.js +234 -38
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
- package/dist/lib/resources/aws/backup/backupVault.js +1 -2
- package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
- package/dist/lib/resources/aws/base/awsStack.js +1 -7
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
- package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
- package/dist/lib/resources/aws/cdn/index.js +18 -0
- package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
- package/dist/lib/resources/aws/compute/ec2.js +33 -6
- package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
- package/dist/lib/resources/aws/compute/ecs.js +31 -115
- package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
- package/dist/lib/resources/aws/compute/lambda.js +209 -32
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
- package/dist/lib/resources/aws/database/dynamodb.js +181 -0
- package/dist/lib/resources/aws/database/index.d.ts +1 -0
- package/dist/lib/resources/aws/database/index.js +2 -1
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
- package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
- package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
- package/dist/lib/resources/aws/index.d.ts +2 -0
- package/dist/lib/resources/aws/index.js +3 -1
- package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
- package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
- package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/index.js +20 -0
- package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
- package/dist/lib/resources/aws/messaging/sns.js +70 -0
- package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
- package/dist/lib/resources/aws/messaging/sqs.js +231 -0
- package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/utils.js +7 -0
- package/dist/lib/resources/aws/networking/ipam.js +1 -2
- package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
- package/dist/lib/resources/aws/networking/vpc.js +1 -2
- package/dist/lib/resources/aws/storage/ecr.js +8 -5
- package/dist/lib/resources/aws/storage/s3.js +1 -2
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.js +1 -1
- package/dist/lib/utils/getConfig.js +3 -2
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/manifestWriter.d.ts +174 -0
- package/dist/lib/utils/manifestWriter.js +233 -0
- package/dist/lib/utils/standardTagsAspect.js +1 -8
- package/dist/lib/utils/validationLogger.d.ts +34 -0
- package/dist/lib/utils/validationLogger.js +83 -0
- package/package.json +3 -3
- package/dist/lib/__tests__/setup.d.ts +0 -48
- package/dist/lib/__tests__/setup.js +0 -1
- package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
- package/dist/lib/patterns/aws/cicdRole.js +0 -68
- package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
- package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
- package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe pattern interfaces.
|
|
3
|
+
*
|
|
4
|
+
* These interfaces provide compile-time type safety for pattern resources.
|
|
5
|
+
* Patterns are high-level constructs that compose multiple infrastructure resources
|
|
6
|
+
* into a cohesive, opinionated deployment (e.g., Payload CMS, Next.js).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const payload = app.addPattern(PatternFactory.build("PayloadApp", {
|
|
10
|
+
* type: "payload",
|
|
11
|
+
* name: "my-cms",
|
|
12
|
+
* source: "../.."
|
|
13
|
+
* }));
|
|
14
|
+
* payload.getDatabase(); // ✓ Available on IPayload
|
|
15
|
+
* payload.getServer(); // ✓ Available on IPayload
|
|
16
|
+
*/
|
|
17
|
+
import { type ICertificate } from "aws-cdk-lib/aws-certificatemanager";
|
|
18
|
+
import { type Duration } from "aws-cdk-lib";
|
|
19
|
+
import { type Construct } from "constructs";
|
|
20
|
+
import { type RelationalDatabase, type DynamoDBDatabase, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type PerformanceInsightsConfig, type PerformanceInsightsRetentionPeriod } from "../database.js";
|
|
21
|
+
import { type LambdaCompute } from "../compute.js";
|
|
22
|
+
import { type PrivateStorage } from "../storage.js";
|
|
23
|
+
import { type QueueMessaging } from "../messaging.js";
|
|
24
|
+
import { type Cdn, type SmartCdnBehaviour } from "../cdn.js";
|
|
25
|
+
export type { ProxyConfig, ReadReplicaConfig, CredentialsConfig, EncryptionConfig, AuroraEncryptionConfig, AuroraWriterConfig, AuroraReadersConfig, PerformanceInsightsConfig, PerformanceInsightsRetentionPeriod };
|
|
26
|
+
/**
|
|
27
|
+
* Full database configuration for patterns.
|
|
28
|
+
* Extends underlying DatabaseFactory props with pattern-specific defaults.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // Minimal - use defaults
|
|
32
|
+
* database: { type: "Instance" }
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Production-ready Instance
|
|
36
|
+
* database: {
|
|
37
|
+
* type: "Instance",
|
|
38
|
+
* instanceType: "t4g.large",
|
|
39
|
+
* allocatedStorage: 50,
|
|
40
|
+
* multiAz: true,
|
|
41
|
+
* performanceInsights: { retentionPeriod: 31 },
|
|
42
|
+
* encryption: { storageKey: { useCMK: true } }
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* // Aurora with readers
|
|
47
|
+
* database: {
|
|
48
|
+
* type: "Aurora",
|
|
49
|
+
* readers: { count: 2 },
|
|
50
|
+
* allowVpcAccess: true
|
|
51
|
+
* }
|
|
52
|
+
*/
|
|
53
|
+
export interface PayloadDatabaseConfig {
|
|
54
|
+
/** Database type: "Instance" or "Aurora". Default: "Instance" */
|
|
55
|
+
type?: "Instance" | "Aurora";
|
|
56
|
+
/** Database name. Default: derived from pattern name */
|
|
57
|
+
databaseName?: string;
|
|
58
|
+
/** Database engine. Default: "postgresql" */
|
|
59
|
+
databaseEngine?: "postgresql" | "mysql";
|
|
60
|
+
/** Enable deletion protection. Default: true */
|
|
61
|
+
deletionProtection?: boolean;
|
|
62
|
+
/** Backup retention in days (1-35). Default: 7 */
|
|
63
|
+
backupRetention?: number;
|
|
64
|
+
/** Database port. Default: engine-specific (5432 for PostgreSQL) */
|
|
65
|
+
port?: number;
|
|
66
|
+
/** Make database publicly accessible (for local development). Default: false */
|
|
67
|
+
publiclyAccessible?: boolean;
|
|
68
|
+
/** IP CIDR to allow when publicly accessible (e.g., "203.0.113.0/32") */
|
|
69
|
+
allowedIpCidr?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Instance type for RDS Instance databases.
|
|
72
|
+
* Examples: "t4g.micro", "t4g.small", "t4g.large", "r6g.large"
|
|
73
|
+
* Default: "t4g.small"
|
|
74
|
+
* Only applies when type: "Instance"
|
|
75
|
+
*/
|
|
76
|
+
instanceType?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Allocated storage in GB for RDS Instance.
|
|
79
|
+
* Default: 20
|
|
80
|
+
* Only applies when type: "Instance"
|
|
81
|
+
*/
|
|
82
|
+
allocatedStorage?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Enable Multi-AZ deployment for high availability.
|
|
85
|
+
* Creates a standby replica in a different AZ.
|
|
86
|
+
* Only applies when type: "Instance"
|
|
87
|
+
*/
|
|
88
|
+
multiAz?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Read replica configuration for RDS Instance.
|
|
91
|
+
* Set to false to explicitly disable.
|
|
92
|
+
* Only applies when type: "Instance"
|
|
93
|
+
*/
|
|
94
|
+
readReplica?: ReadReplicaConfig | false;
|
|
95
|
+
/**
|
|
96
|
+
* Aurora writer instance configuration.
|
|
97
|
+
* Only applies when type: "Aurora"
|
|
98
|
+
*/
|
|
99
|
+
writer?: AuroraWriterConfig;
|
|
100
|
+
/**
|
|
101
|
+
* Aurora reader instances configuration.
|
|
102
|
+
* Set to false to explicitly disable readers.
|
|
103
|
+
* Only applies when type: "Aurora"
|
|
104
|
+
*/
|
|
105
|
+
readers?: AuroraReadersConfig | false;
|
|
106
|
+
/**
|
|
107
|
+
* Allow access from VPC CIDR (avoids cross-stack cyclic dependencies).
|
|
108
|
+
* Only applies when type: "Aurora"
|
|
109
|
+
*/
|
|
110
|
+
allowVpcAccess?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Enhanced monitoring interval.
|
|
113
|
+
* Only applies when type: "Aurora"
|
|
114
|
+
*/
|
|
115
|
+
monitoringInterval?: Duration;
|
|
116
|
+
/**
|
|
117
|
+
* Preferred maintenance window (e.g., "sun:05:00-sun:06:00").
|
|
118
|
+
* Only applies when type: "Aurora"
|
|
119
|
+
*/
|
|
120
|
+
preferredMaintenanceWindow?: string;
|
|
121
|
+
/**
|
|
122
|
+
* Performance Insights configuration.
|
|
123
|
+
* Set to false to explicitly disable.
|
|
124
|
+
* @example { retentionPeriod: 31 }
|
|
125
|
+
*/
|
|
126
|
+
performanceInsights?: PerformanceInsightsConfig | false;
|
|
127
|
+
/**
|
|
128
|
+
* RDS Proxy configuration for connection pooling.
|
|
129
|
+
* Set to false to explicitly disable.
|
|
130
|
+
* @example { maxConnections: 100 }
|
|
131
|
+
*/
|
|
132
|
+
proxy?: ProxyConfig | false;
|
|
133
|
+
/**
|
|
134
|
+
* Credentials configuration (username, rotation).
|
|
135
|
+
*/
|
|
136
|
+
credentials?: CredentialsConfig;
|
|
137
|
+
/**
|
|
138
|
+
* Encryption configuration.
|
|
139
|
+
* For Instance: EncryptionConfig
|
|
140
|
+
* For Aurora: AuroraEncryptionConfig
|
|
141
|
+
* @example { storageKey: { useCMK: true } }
|
|
142
|
+
*/
|
|
143
|
+
encryption?: EncryptionConfig | AuroraEncryptionConfig;
|
|
144
|
+
/** ARN or identifier of snapshot to restore from */
|
|
145
|
+
snapshotIdentifier?: string;
|
|
146
|
+
/** Username from the snapshot (required when restoring) */
|
|
147
|
+
snapshotUsername?: string;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Lambda function configuration for pattern sub-functions.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* server: { memorySize: 2048, timeout: 60 }
|
|
154
|
+
*/
|
|
155
|
+
export interface PatternLambdaConfig {
|
|
156
|
+
/** Memory size in MB. Range: 128-10240. */
|
|
157
|
+
memorySize?: number;
|
|
158
|
+
/** Timeout in seconds. Range: 1-900. */
|
|
159
|
+
timeout?: number;
|
|
160
|
+
/** Ephemeral storage size in MB. Range: 512-10240. Default: 512. */
|
|
161
|
+
ephemeralStorageSize?: number;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Full compute configuration for patterns.
|
|
165
|
+
* Allows per-function configuration for each Lambda in the pattern.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* // Configure individual functions
|
|
169
|
+
* compute: {
|
|
170
|
+
* server: { memorySize: 2048, timeout: 60 },
|
|
171
|
+
* imageOptimisation: { memorySize: 2048 },
|
|
172
|
+
* revalidation: { memorySize: 1024, timeout: 600 }
|
|
173
|
+
* }
|
|
174
|
+
*/
|
|
175
|
+
export interface PayloadComputeConfig {
|
|
176
|
+
/**
|
|
177
|
+
* Server Lambda configuration.
|
|
178
|
+
* Handles main application requests.
|
|
179
|
+
* Defaults: memorySize=1536, timeout=30
|
|
180
|
+
*/
|
|
181
|
+
server?: PatternLambdaConfig;
|
|
182
|
+
/**
|
|
183
|
+
* Image optimisation Lambda configuration.
|
|
184
|
+
* Handles Next.js image optimization.
|
|
185
|
+
* Defaults: memorySize=1536, timeout=30
|
|
186
|
+
*/
|
|
187
|
+
imageOptimisation?: PatternLambdaConfig;
|
|
188
|
+
/**
|
|
189
|
+
* Revalidation Lambda configuration.
|
|
190
|
+
* Handles ISR revalidation from SQS queue.
|
|
191
|
+
* Defaults: memorySize=768, timeout=300
|
|
192
|
+
*/
|
|
193
|
+
revalidation?: PatternLambdaConfig;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* S3 bucket configuration for pattern sub-buckets.
|
|
197
|
+
*/
|
|
198
|
+
export interface PatternStorageBucketConfig {
|
|
199
|
+
/** Enable versioning. Default: false */
|
|
200
|
+
versioned?: boolean;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Full storage configuration for patterns.
|
|
204
|
+
* Allows per-bucket configuration for each S3 bucket in the pattern.
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* storage: {
|
|
208
|
+
* assets: { versioned: true },
|
|
209
|
+
* cache: { versioned: false },
|
|
210
|
+
* media: { versioned: true }
|
|
211
|
+
* }
|
|
212
|
+
*/
|
|
213
|
+
export interface PayloadStorageConfig {
|
|
214
|
+
/** Assets bucket (static files) */
|
|
215
|
+
assets?: PatternStorageBucketConfig;
|
|
216
|
+
/** Cache bucket (ISR cache) */
|
|
217
|
+
cache?: PatternStorageBucketConfig;
|
|
218
|
+
/** Media bucket (uploads) */
|
|
219
|
+
media?: PatternStorageBucketConfig;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* SQS queue configuration for pattern messaging.
|
|
223
|
+
*/
|
|
224
|
+
export interface PatternQueueConfig {
|
|
225
|
+
/** Visibility timeout in seconds. Default: matches revalidation timeout */
|
|
226
|
+
visibilityTimeout?: number;
|
|
227
|
+
/** Message retention period in seconds. Default: 345600 (4 days) */
|
|
228
|
+
messageRetentionPeriod?: number;
|
|
229
|
+
/** Maximum message size in bytes. Default: 262144 (256 KB) */
|
|
230
|
+
maxMessageSize?: number;
|
|
231
|
+
/**
|
|
232
|
+
* Dead letter queue configuration.
|
|
233
|
+
* Set to false to explicitly disable.
|
|
234
|
+
*/
|
|
235
|
+
deadLetterQueue?: {
|
|
236
|
+
enabled?: boolean;
|
|
237
|
+
maxReceiveCount?: number;
|
|
238
|
+
} | false;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Full messaging configuration for patterns.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* messaging: {
|
|
245
|
+
* revalidationQueue: {
|
|
246
|
+
* visibilityTimeout: 600,
|
|
247
|
+
* deadLetterQueue: { enabled: true, maxReceiveCount: 5 }
|
|
248
|
+
* }
|
|
249
|
+
* }
|
|
250
|
+
*/
|
|
251
|
+
export interface PayloadMessagingConfig {
|
|
252
|
+
/** Revalidation queue configuration */
|
|
253
|
+
revalidationQueue?: PatternQueueConfig;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* CDN configuration for Payload pattern.
|
|
257
|
+
*/
|
|
258
|
+
export interface PayloadCdnConfig {
|
|
259
|
+
/** Custom domain names for CloudFront */
|
|
260
|
+
domainNames?: string[];
|
|
261
|
+
/** ACM certificate for custom domains (must be in us-east-1) */
|
|
262
|
+
certificate?: ICertificate;
|
|
263
|
+
/** ACM certificate ARN (alternative to certificate - must be in us-east-1) */
|
|
264
|
+
certificateArn?: string;
|
|
265
|
+
/** Additional CDN behaviours */
|
|
266
|
+
behaviours?: SmartCdnBehaviour[];
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Payload pattern props.
|
|
270
|
+
*
|
|
271
|
+
* Configures a Payload CMS deployment with all required infrastructure:
|
|
272
|
+
* - RDS PostgreSQL database (Aurora or Instance)
|
|
273
|
+
* - S3 buckets (assets, cache, media)
|
|
274
|
+
* - DynamoDB table (tag cache)
|
|
275
|
+
* - SQS FIFO queue (revalidation)
|
|
276
|
+
* - Lambda functions (server, image optimisation, revalidation)
|
|
277
|
+
* - CloudFront distribution
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* // Minimal - works out of box
|
|
281
|
+
* app.addPattern(PatternFactory.build("PayloadApp", {
|
|
282
|
+
* type: "payload",
|
|
283
|
+
* name: "my-cms"
|
|
284
|
+
* }));
|
|
285
|
+
*
|
|
286
|
+
* @example
|
|
287
|
+
* // With custom domain (auto-creates certificate + DNS)
|
|
288
|
+
* app.addPattern(PatternFactory.build("PayloadApp", {
|
|
289
|
+
* type: "payload",
|
|
290
|
+
* name: "my-cms",
|
|
291
|
+
* domain: "cms.example.com"
|
|
292
|
+
* }));
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* // Customised
|
|
296
|
+
* app.addPattern(PatternFactory.build("PayloadApp", {
|
|
297
|
+
* type: "payload",
|
|
298
|
+
* name: "my-cms",
|
|
299
|
+
* database: {
|
|
300
|
+
* type: "Instance",
|
|
301
|
+
* publiclyAccessible: true
|
|
302
|
+
* },
|
|
303
|
+
* compute: {
|
|
304
|
+
* server: { memorySize: 2048 }
|
|
305
|
+
* }
|
|
306
|
+
* }));
|
|
307
|
+
*/
|
|
308
|
+
export interface IPayloadProps {
|
|
309
|
+
/** Pattern type discriminator */
|
|
310
|
+
type: "payload";
|
|
311
|
+
/** Pattern name (used for resource naming) */
|
|
312
|
+
name: string;
|
|
313
|
+
/**
|
|
314
|
+
* Custom domain for the Payload application.
|
|
315
|
+
* When provided, automatically:
|
|
316
|
+
* - Looks up the Route53 hosted zone
|
|
317
|
+
* - Creates an ACM certificate with DNS validation (in us-east-1)
|
|
318
|
+
* - Configures CloudFront with the certificate
|
|
319
|
+
* - Creates an A record (alias) pointing to CloudFront
|
|
320
|
+
*
|
|
321
|
+
* Requires: A Route53 hosted zone for the domain must exist.
|
|
322
|
+
*
|
|
323
|
+
* @example "cms.example.com"
|
|
324
|
+
*/
|
|
325
|
+
domain?: string;
|
|
326
|
+
/** Database configuration */
|
|
327
|
+
database?: PayloadDatabaseConfig;
|
|
328
|
+
/** Compute (Lambda) configuration */
|
|
329
|
+
compute?: PayloadComputeConfig;
|
|
330
|
+
/** Storage (S3) configuration */
|
|
331
|
+
storage?: PayloadStorageConfig;
|
|
332
|
+
/** Messaging (SQS) configuration */
|
|
333
|
+
messaging?: PayloadMessagingConfig;
|
|
334
|
+
/** CDN (CloudFront) configuration - for advanced use. Use `domain` for simple setup. */
|
|
335
|
+
cdn?: PayloadCdnConfig;
|
|
336
|
+
/** Additional environment variables for server Lambda */
|
|
337
|
+
environment?: Record<string, string>;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Union of all pattern props.
|
|
341
|
+
* Extend this when adding new patterns (e.g., INextjsProps, IRemixProps).
|
|
342
|
+
*/
|
|
343
|
+
export type IPatternProps = IPayloadProps;
|
|
344
|
+
/**
|
|
345
|
+
* Pattern type discriminator.
|
|
346
|
+
*/
|
|
347
|
+
export type PatternType = "payload";
|
|
348
|
+
/**
|
|
349
|
+
* Base pattern interface.
|
|
350
|
+
* All patterns implement this interface.
|
|
351
|
+
*/
|
|
352
|
+
export interface IPattern {
|
|
353
|
+
/** The type of pattern. Used for runtime type narrowing. */
|
|
354
|
+
readonly patternType: PatternType;
|
|
355
|
+
/** The underlying CDK construct node. */
|
|
356
|
+
readonly node: Construct["node"];
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Payload pattern interface.
|
|
360
|
+
* Provides access to all underlying resources for escape hatches.
|
|
361
|
+
*
|
|
362
|
+
* @example
|
|
363
|
+
* // Escape hatches - full access to underlying resources
|
|
364
|
+
* payload.getDatabase().grantConnect(someOtherLambda);
|
|
365
|
+
* payload.getServer().getLambdaFunction().addEnvironment("CUSTOM_VAR", "value");
|
|
366
|
+
* payload.getCdn().getDistribution().addBehavior("/custom/*", customOrigin);
|
|
367
|
+
*/
|
|
368
|
+
export interface IPayload extends IPattern {
|
|
369
|
+
readonly patternType: "payload";
|
|
370
|
+
/** Get the PostgreSQL database (Aurora or Instance) */
|
|
371
|
+
getDatabase(): RelationalDatabase;
|
|
372
|
+
/** Get the Server Lambda function */
|
|
373
|
+
getServer(): LambdaCompute;
|
|
374
|
+
/** Get the Image Optimisation Lambda function */
|
|
375
|
+
getImageOptimisation(): LambdaCompute;
|
|
376
|
+
/** Get the Revalidation Lambda function */
|
|
377
|
+
getRevalidation(): LambdaCompute;
|
|
378
|
+
/** Get the Assets S3 bucket (static files) */
|
|
379
|
+
getAssetsBucket(): PrivateStorage;
|
|
380
|
+
/** Get the Cache S3 bucket (ISR cache) */
|
|
381
|
+
getCacheBucket(): PrivateStorage;
|
|
382
|
+
/** Get the Media S3 bucket (uploads) */
|
|
383
|
+
getMediaBucket(): PrivateStorage;
|
|
384
|
+
/** Get the Tag Cache DynamoDB table */
|
|
385
|
+
getTagCache(): DynamoDBDatabase;
|
|
386
|
+
/** Get the Revalidation SQS queue */
|
|
387
|
+
getRevalidationQueue(): QueueMessaging;
|
|
388
|
+
/** Get the CloudFront distribution */
|
|
389
|
+
getCdn(): Cdn;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Union type representing any pattern interface.
|
|
393
|
+
* Use with type guards for generic handling.
|
|
394
|
+
*/
|
|
395
|
+
export type AnyPattern = IPayload;
|
|
396
|
+
/**
|
|
397
|
+
* Type guard to check if a pattern is Payload.
|
|
398
|
+
*/
|
|
399
|
+
export declare function isPayloadPattern(pattern: IPattern): pattern is IPayload;
|
|
400
|
+
/**
|
|
401
|
+
* Type guard to check if a resource is any pattern type.
|
|
402
|
+
*/
|
|
403
|
+
export declare function isPattern(resource: unknown): resource is IPattern;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type-safe pattern interfaces.
|
|
4
|
+
*
|
|
5
|
+
* These interfaces provide compile-time type safety for pattern resources.
|
|
6
|
+
* Patterns are high-level constructs that compose multiple infrastructure resources
|
|
7
|
+
* into a cohesive, opinionated deployment (e.g., Payload CMS, Next.js).
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const payload = app.addPattern(PatternFactory.build("PayloadApp", {
|
|
11
|
+
* type: "payload",
|
|
12
|
+
* name: "my-cms",
|
|
13
|
+
* source: "../.."
|
|
14
|
+
* }));
|
|
15
|
+
* payload.getDatabase(); // ✓ Available on IPayload
|
|
16
|
+
* payload.getServer(); // ✓ Available on IPayload
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.isPayloadPattern = isPayloadPattern;
|
|
20
|
+
exports.isPattern = isPattern;
|
|
21
|
+
/**
|
|
22
|
+
* Type guard to check if a pattern is Payload.
|
|
23
|
+
*/
|
|
24
|
+
function isPayloadPattern(pattern) {
|
|
25
|
+
return pattern.patternType === "payload";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Type guard to check if a resource is any pattern type.
|
|
29
|
+
*/
|
|
30
|
+
function isPattern(resource) {
|
|
31
|
+
return (resource !== null &&
|
|
32
|
+
typeof resource === "object" &&
|
|
33
|
+
"patternType" in resource &&
|
|
34
|
+
typeof resource.patternType === "string");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvaW50ZXJmYWNlcy9wYXR0ZXJuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7O0FBNGNILDRDQUVDO0FBS0QsOEJBT0M7QUFqQkQ7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFpQjtJQUNoRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxRQUFpQjtJQUN6QyxPQUFPLENBQ0wsUUFBUSxLQUFLLElBQUk7UUFDakIsT0FBTyxRQUFRLEtBQUssUUFBUTtRQUM1QixhQUFhLElBQUksUUFBUTtRQUN6QixPQUFRLFFBQXFCLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FDdkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUtc2FmZSBwYXR0ZXJuIGludGVyZmFjZXMuXG4gKlxuICogVGhlc2UgaW50ZXJmYWNlcyBwcm92aWRlIGNvbXBpbGUtdGltZSB0eXBlIHNhZmV0eSBmb3IgcGF0dGVybiByZXNvdXJjZXMuXG4gKiBQYXR0ZXJucyBhcmUgaGlnaC1sZXZlbCBjb25zdHJ1Y3RzIHRoYXQgY29tcG9zZSBtdWx0aXBsZSBpbmZyYXN0cnVjdHVyZSByZXNvdXJjZXNcbiAqIGludG8gYSBjb2hlc2l2ZSwgb3BpbmlvbmF0ZWQgZGVwbG95bWVudCAoZS5nLiwgUGF5bG9hZCBDTVMsIE5leHQuanMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwYXlsb2FkID0gYXBwLmFkZFBhdHRlcm4oUGF0dGVybkZhY3RvcnkuYnVpbGQoXCJQYXlsb2FkQXBwXCIsIHtcbiAqICAgdHlwZTogXCJwYXlsb2FkXCIsXG4gKiAgIG5hbWU6IFwibXktY21zXCIsXG4gKiAgIHNvdXJjZTogXCIuLi8uLlwiXG4gKiB9KSk7XG4gKiBwYXlsb2FkLmdldERhdGFiYXNlKCk7IC8vIOKckyBBdmFpbGFibGUgb24gSVBheWxvYWRcbiAqIHBheWxvYWQuZ2V0U2VydmVyKCk7IC8vIOKckyBBdmFpbGFibGUgb24gSVBheWxvYWRcbiAqL1xuXG5pbXBvcnQgeyB0eXBlIElDZXJ0aWZpY2F0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgUmVsYXRpb25hbERhdGFiYXNlLFxuICB0eXBlIER5bmFtb0RCRGF0YWJhc2UsXG4gIHR5cGUgUHJveHlDb25maWcsXG4gIHR5cGUgUmVhZFJlcGxpY2FDb25maWcsXG4gIHR5cGUgQ3JlZGVudGlhbHNDb25maWcsXG4gIHR5cGUgRW5jcnlwdGlvbkNvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnLFxuICB0eXBlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcsXG4gIHR5cGUgUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZFxufSBmcm9tIFwiLi4vZGF0YWJhc2UuanNcIjtcbmltcG9ydCB7IHR5cGUgTGFtYmRhQ29tcHV0ZSB9IGZyb20gXCIuLi9jb21wdXRlLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFByaXZhdGVTdG9yYWdlIH0gZnJvbSBcIi4uL3N0b3JhZ2UuanNcIjtcbmltcG9ydCB7IHR5cGUgUXVldWVNZXNzYWdpbmcgfSBmcm9tIFwiLi4vbWVzc2FnaW5nLmpzXCI7XG5pbXBvcnQgeyB0eXBlIENkbiwgdHlwZSBTbWFydENkbkJlaGF2aW91ciB9IGZyb20gXCIuLi9jZG4uanNcIjtcblxuLy8gUmUtZXhwb3J0IGRhdGFiYXNlIHR5cGVzIGZvciBjb25zdW1lciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUge1xuICBQcm94eUNvbmZpZyxcbiAgUmVhZFJlcGxpY2FDb25maWcsXG4gIENyZWRlbnRpYWxzQ29uZmlnLFxuICBFbmNyeXB0aW9uQ29uZmlnLFxuICBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICBBdXJvcmFXcml0ZXJDb25maWcsXG4gIEF1cm9yYVJlYWRlcnNDb25maWcsXG4gIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcsXG4gIFBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25QZXJpb2Rcbn07XG5cbi8qKlxuICogRnVsbCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGZvciBwYXR0ZXJucy5cbiAqIEV4dGVuZHMgdW5kZXJseWluZyBEYXRhYmFzZUZhY3RvcnkgcHJvcHMgd2l0aCBwYXR0ZXJuLXNwZWNpZmljIGRlZmF1bHRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNaW5pbWFsIC0gdXNlIGRlZmF1bHRzXG4gKiBkYXRhYmFzZTogeyB0eXBlOiBcIkluc3RhbmNlXCIgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQcm9kdWN0aW9uLXJlYWR5IEluc3RhbmNlXG4gKiBkYXRhYmFzZToge1xuICogICB0eXBlOiBcIkluc3RhbmNlXCIsXG4gKiAgIGluc3RhbmNlVHlwZTogXCJ0NGcubGFyZ2VcIixcbiAqICAgYWxsb2NhdGVkU3RvcmFnZTogNTAsXG4gKiAgIG11bHRpQXo6IHRydWUsXG4gKiAgIHBlcmZvcm1hbmNlSW5zaWdodHM6IHsgcmV0ZW50aW9uUGVyaW9kOiAzMSB9LFxuICogICBlbmNyeXB0aW9uOiB7IHN0b3JhZ2VLZXk6IHsgdXNlQ01LOiB0cnVlIH0gfVxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBdXJvcmEgd2l0aCByZWFkZXJzXG4gKiBkYXRhYmFzZToge1xuICogICB0eXBlOiBcIkF1cm9yYVwiLFxuICogICByZWFkZXJzOiB7IGNvdW50OiAyIH0sXG4gKiAgIGFsbG93VnBjQWNjZXNzOiB0cnVlXG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZERhdGFiYXNlQ29uZmlnIHtcbiAgLy8gLS0tIEJhc2UgQ29uZmlndXJhdGlvbiAtLS1cblxuICAvKiogRGF0YWJhc2UgdHlwZTogXCJJbnN0YW5jZVwiIG9yIFwiQXVyb3JhXCIuIERlZmF1bHQ6IFwiSW5zdGFuY2VcIiAqL1xuICB0eXBlPzogXCJJbnN0YW5jZVwiIHwgXCJBdXJvcmFcIjtcbiAgLyoqIERhdGFiYXNlIG5hbWUuIERlZmF1bHQ6IGRlcml2ZWQgZnJvbSBwYXR0ZXJuIG5hbWUgKi9cbiAgZGF0YWJhc2VOYW1lPzogc3RyaW5nO1xuICAvKiogRGF0YWJhc2UgZW5naW5lLiBEZWZhdWx0OiBcInBvc3RncmVzcWxcIiAqL1xuICBkYXRhYmFzZUVuZ2luZT86IFwicG9zdGdyZXNxbFwiIHwgXCJteXNxbFwiO1xuXG4gIC8vIC0tLSBDb21tb24gQ29uZmlndXJhdGlvbiAtLS1cblxuICAvKiogRW5hYmxlIGRlbGV0aW9uIHByb3RlY3Rpb24uIERlZmF1bHQ6IHRydWUgKi9cbiAgZGVsZXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEJhY2t1cCByZXRlbnRpb24gaW4gZGF5cyAoMS0zNSkuIERlZmF1bHQ6IDcgKi9cbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICAvKiogRGF0YWJhc2UgcG9ydC4gRGVmYXVsdDogZW5naW5lLXNwZWNpZmljICg1NDMyIGZvciBQb3N0Z3JlU1FMKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuXG4gIC8vIC0tLSBQdWJsaWMgQWNjZXNzIChEZXZlbG9wbWVudCBVc2UpIC0tLVxuXG4gIC8qKiBNYWtlIGRhdGFiYXNlIHB1YmxpY2x5IGFjY2Vzc2libGUgKGZvciBsb2NhbCBkZXZlbG9wbWVudCkuIERlZmF1bHQ6IGZhbHNlICovXG4gIHB1YmxpY2x5QWNjZXNzaWJsZT86IGJvb2xlYW47XG4gIC8qKiBJUCBDSURSIHRvIGFsbG93IHdoZW4gcHVibGljbHkgYWNjZXNzaWJsZSAoZS5nLiwgXCIyMDMuMC4xMTMuMC8zMlwiKSAqL1xuICBhbGxvd2VkSXBDaWRyPzogc3RyaW5nO1xuXG4gIC8vIC0tLSBJbnN0YW5jZS1TcGVjaWZpYyBDb25maWd1cmF0aW9uIC0tLVxuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSB0eXBlIGZvciBSRFMgSW5zdGFuY2UgZGF0YWJhc2VzLlxuICAgKiBFeGFtcGxlczogXCJ0NGcubWljcm9cIiwgXCJ0NGcuc21hbGxcIiwgXCJ0NGcubGFyZ2VcIiwgXCJyNmcubGFyZ2VcIlxuICAgKiBEZWZhdWx0OiBcInQ0Zy5zbWFsbFwiXG4gICAqIE9ubHkgYXBwbGllcyB3aGVuIHR5cGU6IFwiSW5zdGFuY2VcIlxuICAgKi9cbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWxsb2NhdGVkIHN0b3JhZ2UgaW4gR0IgZm9yIFJEUyBJbnN0YW5jZS5cbiAgICogRGVmYXVsdDogMjBcbiAgICogT25seSBhcHBsaWVzIHdoZW4gdHlwZTogXCJJbnN0YW5jZVwiXG4gICAqL1xuICBhbGxvY2F0ZWRTdG9yYWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogRW5hYmxlIE11bHRpLUFaIGRlcGxveW1lbnQgZm9yIGhpZ2ggYXZhaWxhYmlsaXR5LlxuICAgKiBDcmVhdGVzIGEgc3RhbmRieSByZXBsaWNhIGluIGEgZGlmZmVyZW50IEFaLlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0eXBlOiBcIkluc3RhbmNlXCJcbiAgICovXG4gIG11bHRpQXo/OiBib29sZWFuO1xuICAvKipcbiAgICogUmVhZCByZXBsaWNhIGNvbmZpZ3VyYXRpb24gZm9yIFJEUyBJbnN0YW5jZS5cbiAgICogU2V0IHRvIGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZS5cbiAgICogT25seSBhcHBsaWVzIHdoZW4gdHlwZTogXCJJbnN0YW5jZVwiXG4gICAqL1xuICByZWFkUmVwbGljYT86IFJlYWRSZXBsaWNhQ29uZmlnIHwgZmFsc2U7XG5cbiAgLy8gLS0tIEF1cm9yYS1TcGVjaWZpYyBDb25maWd1cmF0aW9uIC0tLVxuXG4gIC8qKlxuICAgKiBBdXJvcmEgd3JpdGVyIGluc3RhbmNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIE9ubHkgYXBwbGllcyB3aGVuIHR5cGU6IFwiQXVyb3JhXCJcbiAgICovXG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgLyoqXG4gICAqIEF1cm9yYSByZWFkZXIgaW5zdGFuY2VzIGNvbmZpZ3VyYXRpb24uXG4gICAqIFNldCB0byBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUgcmVhZGVycy5cbiAgICogT25seSBhcHBsaWVzIHdoZW4gdHlwZTogXCJBdXJvcmFcIlxuICAgKi9cbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgLyoqXG4gICAqIEFsbG93IGFjY2VzcyBmcm9tIFZQQyBDSURSIChhdm9pZHMgY3Jvc3Mtc3RhY2sgY3ljbGljIGRlcGVuZGVuY2llcykuXG4gICAqIE9ubHkgYXBwbGllcyB3aGVuIHR5cGU6IFwiQXVyb3JhXCJcbiAgICovXG4gIGFsbG93VnBjQWNjZXNzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuaGFuY2VkIG1vbml0b3JpbmcgaW50ZXJ2YWwuXG4gICAqIE9ubHkgYXBwbGllcyB3aGVuIHR5cGU6IFwiQXVyb3JhXCJcbiAgICovXG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICAvKipcbiAgICogUHJlZmVycmVkIG1haW50ZW5hbmNlIHdpbmRvdyAoZS5nLiwgXCJzdW46MDU6MDAtc3VuOjA2OjAwXCIpLlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0eXBlOiBcIkF1cm9yYVwiXG4gICAqL1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcblxuICAvLyAtLS0gU2hhcmVkIEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gLS0tXG5cbiAgLyoqXG4gICAqIFBlcmZvcm1hbmNlIEluc2lnaHRzIGNvbmZpZ3VyYXRpb24uXG4gICAqIFNldCB0byBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUuXG4gICAqIEBleGFtcGxlIHsgcmV0ZW50aW9uUGVyaW9kOiAzMSB9XG4gICAqL1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKipcbiAgICogUkRTIFByb3h5IGNvbmZpZ3VyYXRpb24gZm9yIGNvbm5lY3Rpb24gcG9vbGluZy5cbiAgICogU2V0IHRvIGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZS5cbiAgICogQGV4YW1wbGUgeyBtYXhDb25uZWN0aW9uczogMTAwIH1cbiAgICovXG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgLyoqXG4gICAqIENyZWRlbnRpYWxzIGNvbmZpZ3VyYXRpb24gKHVzZXJuYW1lLCByb3RhdGlvbikuXG4gICAqL1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKiBGb3IgSW5zdGFuY2U6IEVuY3J5cHRpb25Db25maWdcbiAgICogRm9yIEF1cm9yYTogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZ1xuICAgKiBAZXhhbXBsZSB7IHN0b3JhZ2VLZXk6IHsgdXNlQ01LOiB0cnVlIH0gfVxuICAgKi9cbiAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWcgfCBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuXG4gIC8vIC0tLSBTbmFwc2hvdCBSZXN0b3JlIC0tLVxuXG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgZnJvbSB0aGUgc25hcHNob3QgKHJlcXVpcmVkIHdoZW4gcmVzdG9yaW5nKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExhbWJkYSBmdW5jdGlvbiBjb25maWd1cmF0aW9uIGZvciBwYXR0ZXJuIHN1Yi1mdW5jdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNlcnZlcjogeyBtZW1vcnlTaXplOiAyMDQ4LCB0aW1lb3V0OiA2MCB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0dGVybkxhbWJkYUNvbmZpZyB7XG4gIC8qKiBNZW1vcnkgc2l6ZSBpbiBNQi4gUmFuZ2U6IDEyOC0xMDI0MC4gKi9cbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqIFRpbWVvdXQgaW4gc2Vjb25kcy4gUmFuZ2U6IDEtOTAwLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogRXBoZW1lcmFsIHN0b3JhZ2Ugc2l6ZSBpbiBNQi4gUmFuZ2U6IDUxMi0xMDI0MC4gRGVmYXVsdDogNTEyLiAqL1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGdWxsIGNvbXB1dGUgY29uZmlndXJhdGlvbiBmb3IgcGF0dGVybnMuXG4gKiBBbGxvd3MgcGVyLWZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggTGFtYmRhIGluIHRoZSBwYXR0ZXJuLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb25maWd1cmUgaW5kaXZpZHVhbCBmdW5jdGlvbnNcbiAqIGNvbXB1dGU6IHtcbiAqICAgc2VydmVyOiB7IG1lbW9yeVNpemU6IDIwNDgsIHRpbWVvdXQ6IDYwIH0sXG4gKiAgIGltYWdlT3B0aW1pc2F0aW9uOiB7IG1lbW9yeVNpemU6IDIwNDggfSxcbiAqICAgcmV2YWxpZGF0aW9uOiB7IG1lbW9yeVNpemU6IDEwMjQsIHRpbWVvdXQ6IDYwMCB9XG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvbXB1dGVDb25maWcge1xuICAvKipcbiAgICogU2VydmVyIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKiBIYW5kbGVzIG1haW4gYXBwbGljYXRpb24gcmVxdWVzdHMuXG4gICAqIERlZmF1bHRzOiBtZW1vcnlTaXplPTE1MzYsIHRpbWVvdXQ9MzBcbiAgICovXG4gIHNlcnZlcj86IFBhdHRlcm5MYW1iZGFDb25maWc7XG4gIC8qKlxuICAgKiBJbWFnZSBvcHRpbWlzYXRpb24gTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqIEhhbmRsZXMgTmV4dC5qcyBpbWFnZSBvcHRpbWl6YXRpb24uXG4gICAqIERlZmF1bHRzOiBtZW1vcnlTaXplPTE1MzYsIHRpbWVvdXQ9MzBcbiAgICovXG4gIGltYWdlT3B0aW1pc2F0aW9uPzogUGF0dGVybkxhbWJkYUNvbmZpZztcbiAgLyoqXG4gICAqIFJldmFsaWRhdGlvbiBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICogSGFuZGxlcyBJU1IgcmV2YWxpZGF0aW9uIGZyb20gU1FTIHF1ZXVlLlxuICAgKiBEZWZhdWx0czogbWVtb3J5U2l6ZT03NjgsIHRpbWVvdXQ9MzAwXG4gICAqL1xuICByZXZhbGlkYXRpb24/OiBQYXR0ZXJuTGFtYmRhQ29uZmlnO1xufVxuXG4vKipcbiAqIFMzIGJ1Y2tldCBjb25maWd1cmF0aW9uIGZvciBwYXR0ZXJuIHN1Yi1idWNrZXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdHRlcm5TdG9yYWdlQnVja2V0Q29uZmlnIHtcbiAgLyoqIEVuYWJsZSB2ZXJzaW9uaW5nLiBEZWZhdWx0OiBmYWxzZSAqL1xuICB2ZXJzaW9uZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZ1bGwgc3RvcmFnZSBjb25maWd1cmF0aW9uIGZvciBwYXR0ZXJucy5cbiAqIEFsbG93cyBwZXItYnVja2V0IGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggUzMgYnVja2V0IGluIHRoZSBwYXR0ZXJuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzdG9yYWdlOiB7XG4gKiAgIGFzc2V0czogeyB2ZXJzaW9uZWQ6IHRydWUgfSxcbiAqICAgY2FjaGU6IHsgdmVyc2lvbmVkOiBmYWxzZSB9LFxuICogICBtZWRpYTogeyB2ZXJzaW9uZWQ6IHRydWUgfVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRTdG9yYWdlQ29uZmlnIHtcbiAgLyoqIEFzc2V0cyBidWNrZXQgKHN0YXRpYyBmaWxlcykgKi9cbiAgYXNzZXRzPzogUGF0dGVyblN0b3JhZ2VCdWNrZXRDb25maWc7XG4gIC8qKiBDYWNoZSBidWNrZXQgKElTUiBjYWNoZSkgKi9cbiAgY2FjaGU/OiBQYXR0ZXJuU3RvcmFnZUJ1Y2tldENvbmZpZztcbiAgLyoqIE1lZGlhIGJ1Y2tldCAodXBsb2FkcykgKi9cbiAgbWVkaWE/OiBQYXR0ZXJuU3RvcmFnZUJ1Y2tldENvbmZpZztcbn1cblxuLyoqXG4gKiBTUVMgcXVldWUgY29uZmlndXJhdGlvbiBmb3IgcGF0dGVybiBtZXNzYWdpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0dGVyblF1ZXVlQ29uZmlnIHtcbiAgLyoqIFZpc2liaWxpdHkgdGltZW91dCBpbiBzZWNvbmRzLiBEZWZhdWx0OiBtYXRjaGVzIHJldmFsaWRhdGlvbiB0aW1lb3V0ICovXG4gIHZpc2liaWxpdHlUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWVzc2FnZSByZXRlbnRpb24gcGVyaW9kIGluIHNlY29uZHMuIERlZmF1bHQ6IDM0NTYwMCAoNCBkYXlzKSAqL1xuICBtZXNzYWdlUmV0ZW50aW9uUGVyaW9kPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBtZXNzYWdlIHNpemUgaW4gYnl0ZXMuIERlZmF1bHQ6IDI2MjE0NCAoMjU2IEtCKSAqL1xuICBtYXhNZXNzYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIERlYWQgbGV0dGVyIHF1ZXVlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFNldCB0byBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUuXG4gICAqL1xuICBkZWFkTGV0dGVyUXVldWU/OlxuICAgIHwge1xuICAgICAgICBlbmFibGVkPzogYm9vbGVhbjtcbiAgICAgICAgbWF4UmVjZWl2ZUNvdW50PzogbnVtYmVyO1xuICAgICAgfVxuICAgIHwgZmFsc2U7XG59XG5cbi8qKlxuICogRnVsbCBtZXNzYWdpbmcgY29uZmlndXJhdGlvbiBmb3IgcGF0dGVybnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1lc3NhZ2luZzoge1xuICogICByZXZhbGlkYXRpb25RdWV1ZToge1xuICogICAgIHZpc2liaWxpdHlUaW1lb3V0OiA2MDAsXG4gKiAgICAgZGVhZExldHRlclF1ZXVlOiB7IGVuYWJsZWQ6IHRydWUsIG1heFJlY2VpdmVDb3VudDogNSB9XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkTWVzc2FnaW5nQ29uZmlnIHtcbiAgLyoqIFJldmFsaWRhdGlvbiBxdWV1ZSBjb25maWd1cmF0aW9uICovXG4gIHJldmFsaWRhdGlvblF1ZXVlPzogUGF0dGVyblF1ZXVlQ29uZmlnO1xufVxuXG4vKipcbiAqIENETiBjb25maWd1cmF0aW9uIGZvciBQYXlsb2FkIHBhdHRlcm4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENkbkNvbmZpZyB7XG4gIC8qKiBDdXN0b20gZG9tYWluIG5hbWVzIGZvciBDbG91ZEZyb250ICovXG4gIGRvbWFpbk5hbWVzPzogc3RyaW5nW107XG4gIC8qKiBBQ00gY2VydGlmaWNhdGUgZm9yIGN1c3RvbSBkb21haW5zIChtdXN0IGJlIGluIHVzLWVhc3QtMSkgKi9cbiAgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIC8qKiBBQ00gY2VydGlmaWNhdGUgQVJOIChhbHRlcm5hdGl2ZSB0byBjZXJ0aWZpY2F0ZSAtIG11c3QgYmUgaW4gdXMtZWFzdC0xKSAqL1xuICBjZXJ0aWZpY2F0ZUFybj86IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ0ROIGJlaGF2aW91cnMgKi9cbiAgYmVoYXZpb3Vycz86IFNtYXJ0Q2RuQmVoYXZpb3VyW107XG59XG5cbi8qKlxuICogUGF5bG9hZCBwYXR0ZXJuIHByb3BzLlxuICpcbiAqIENvbmZpZ3VyZXMgYSBQYXlsb2FkIENNUyBkZXBsb3ltZW50IHdpdGggYWxsIHJlcXVpcmVkIGluZnJhc3RydWN0dXJlOlxuICogLSBSRFMgUG9zdGdyZVNRTCBkYXRhYmFzZSAoQXVyb3JhIG9yIEluc3RhbmNlKVxuICogLSBTMyBidWNrZXRzIChhc3NldHMsIGNhY2hlLCBtZWRpYSlcbiAqIC0gRHluYW1vREIgdGFibGUgKHRhZyBjYWNoZSlcbiAqIC0gU1FTIEZJRk8gcXVldWUgKHJldmFsaWRhdGlvbilcbiAqIC0gTGFtYmRhIGZ1bmN0aW9ucyAoc2VydmVyLCBpbWFnZSBvcHRpbWlzYXRpb24sIHJldmFsaWRhdGlvbilcbiAqIC0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWluaW1hbCAtIHdvcmtzIG91dCBvZiBib3hcbiAqIGFwcC5hZGRQYXR0ZXJuKFBhdHRlcm5GYWN0b3J5LmJ1aWxkKFwiUGF5bG9hZEFwcFwiLCB7XG4gKiAgIHR5cGU6IFwicGF5bG9hZFwiLFxuICogICBuYW1lOiBcIm15LWNtc1wiXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdpdGggY3VzdG9tIGRvbWFpbiAoYXV0by1jcmVhdGVzIGNlcnRpZmljYXRlICsgRE5TKVxuICogYXBwLmFkZFBhdHRlcm4oUGF0dGVybkZhY3RvcnkuYnVpbGQoXCJQYXlsb2FkQXBwXCIsIHtcbiAqICAgdHlwZTogXCJwYXlsb2FkXCIsXG4gKiAgIG5hbWU6IFwibXktY21zXCIsXG4gKiAgIGRvbWFpbjogXCJjbXMuZXhhbXBsZS5jb21cIlxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b21pc2VkXG4gKiBhcHAuYWRkUGF0dGVybihQYXR0ZXJuRmFjdG9yeS5idWlsZChcIlBheWxvYWRBcHBcIiwge1xuICogICB0eXBlOiBcInBheWxvYWRcIixcbiAqICAgbmFtZTogXCJteS1jbXNcIixcbiAqICAgZGF0YWJhc2U6IHtcbiAqICAgICB0eXBlOiBcIkluc3RhbmNlXCIsXG4gKiAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiB0cnVlXG4gKiAgIH0sXG4gKiAgIGNvbXB1dGU6IHtcbiAqICAgICBzZXJ2ZXI6IHsgbWVtb3J5U2l6ZTogMjA0OCB9XG4gKiAgIH1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUGF5bG9hZFByb3BzIHtcbiAgLyoqIFBhdHRlcm4gdHlwZSBkaXNjcmltaW5hdG9yICovXG4gIHR5cGU6IFwicGF5bG9hZFwiO1xuICAvKiogUGF0dGVybiBuYW1lICh1c2VkIGZvciByZXNvdXJjZSBuYW1pbmcpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIGRvbWFpbiBmb3IgdGhlIFBheWxvYWQgYXBwbGljYXRpb24uXG4gICAqIFdoZW4gcHJvdmlkZWQsIGF1dG9tYXRpY2FsbHk6XG4gICAqIC0gTG9va3MgdXAgdGhlIFJvdXRlNTMgaG9zdGVkIHpvbmVcbiAgICogLSBDcmVhdGVzIGFuIEFDTSBjZXJ0aWZpY2F0ZSB3aXRoIEROUyB2YWxpZGF0aW9uIChpbiB1cy1lYXN0LTEpXG4gICAqIC0gQ29uZmlndXJlcyBDbG91ZEZyb250IHdpdGggdGhlIGNlcnRpZmljYXRlXG4gICAqIC0gQ3JlYXRlcyBhbiBBIHJlY29yZCAoYWxpYXMpIHBvaW50aW5nIHRvIENsb3VkRnJvbnRcbiAgICpcbiAgICogUmVxdWlyZXM6IEEgUm91dGU1MyBob3N0ZWQgem9uZSBmb3IgdGhlIGRvbWFpbiBtdXN0IGV4aXN0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBcImNtcy5leGFtcGxlLmNvbVwiXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIERhdGFiYXNlIGNvbmZpZ3VyYXRpb24gKi9cbiAgZGF0YWJhc2U/OiBQYXlsb2FkRGF0YWJhc2VDb25maWc7XG4gIC8qKiBDb21wdXRlIChMYW1iZGEpIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29tcHV0ZT86IFBheWxvYWRDb21wdXRlQ29uZmlnO1xuICAvKiogU3RvcmFnZSAoUzMpIGNvbmZpZ3VyYXRpb24gKi9cbiAgc3RvcmFnZT86IFBheWxvYWRTdG9yYWdlQ29uZmlnO1xuICAvKiogTWVzc2FnaW5nIChTUVMpIGNvbmZpZ3VyYXRpb24gKi9cbiAgbWVzc2FnaW5nPzogUGF5bG9hZE1lc3NhZ2luZ0NvbmZpZztcbiAgLyoqIENETiAoQ2xvdWRGcm9udCkgY29uZmlndXJhdGlvbiAtIGZvciBhZHZhbmNlZCB1c2UuIFVzZSBgZG9tYWluYCBmb3Igc2ltcGxlIHNldHVwLiAqL1xuICBjZG4/OiBQYXlsb2FkQ2RuQ29uZmlnO1xuXG4gIC8qKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igc2VydmVyIExhbWJkYSAqL1xuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogVW5pb24gb2YgYWxsIHBhdHRlcm4gcHJvcHMuXG4gKiBFeHRlbmQgdGhpcyB3aGVuIGFkZGluZyBuZXcgcGF0dGVybnMgKGUuZy4sIElOZXh0anNQcm9wcywgSVJlbWl4UHJvcHMpLlxuICovXG5leHBvcnQgdHlwZSBJUGF0dGVyblByb3BzID0gSVBheWxvYWRQcm9wczsgLy8gfCBJTmV4dGpzUHJvcHMgfCBJUmVtaXhQcm9wcyBpbiBmdXR1cmVcblxuLyoqXG4gKiBQYXR0ZXJuIHR5cGUgZGlzY3JpbWluYXRvci5cbiAqL1xuZXhwb3J0IHR5cGUgUGF0dGVyblR5cGUgPSBcInBheWxvYWRcIjsgLy8gfCBcIm5leHRqc1wiIHwgXCJyZW1peFwiIGluIGZ1dHVyZVxuXG4vKipcbiAqIEJhc2UgcGF0dGVybiBpbnRlcmZhY2UuXG4gKiBBbGwgcGF0dGVybnMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQYXR0ZXJuIHtcbiAgLyoqIFRoZSB0eXBlIG9mIHBhdHRlcm4uIFVzZWQgZm9yIHJ1bnRpbWUgdHlwZSBuYXJyb3dpbmcuICovXG4gIHJlYWRvbmx5IHBhdHRlcm5UeXBlOiBQYXR0ZXJuVHlwZTtcblxuICAvKiogVGhlIHVuZGVybHlpbmcgQ0RLIGNvbnN0cnVjdCBub2RlLiAqL1xuICByZWFkb25seSBub2RlOiBDb25zdHJ1Y3RbXCJub2RlXCJdO1xufVxuXG4vKipcbiAqIFBheWxvYWQgcGF0dGVybiBpbnRlcmZhY2UuXG4gKiBQcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzIGZvciBlc2NhcGUgaGF0Y2hlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIGhhdGNoZXMgLSBmdWxsIGFjY2VzcyB0byB1bmRlcmx5aW5nIHJlc291cmNlc1xuICogcGF5bG9hZC5nZXREYXRhYmFzZSgpLmdyYW50Q29ubmVjdChzb21lT3RoZXJMYW1iZGEpO1xuICogcGF5bG9hZC5nZXRTZXJ2ZXIoKS5nZXRMYW1iZGFGdW5jdGlvbigpLmFkZEVudmlyb25tZW50KFwiQ1VTVE9NX1ZBUlwiLCBcInZhbHVlXCIpO1xuICogcGF5bG9hZC5nZXRDZG4oKS5nZXREaXN0cmlidXRpb24oKS5hZGRCZWhhdmlvcihcIi9jdXN0b20vKlwiLCBjdXN0b21PcmlnaW4pO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElQYXlsb2FkIGV4dGVuZHMgSVBhdHRlcm4ge1xuICByZWFkb25seSBwYXR0ZXJuVHlwZTogXCJwYXlsb2FkXCI7XG5cbiAgLyoqIEdldCB0aGUgUG9zdGdyZVNRTCBkYXRhYmFzZSAoQXVyb3JhIG9yIEluc3RhbmNlKSAqL1xuICBnZXREYXRhYmFzZSgpOiBSZWxhdGlvbmFsRGF0YWJhc2U7XG5cbiAgLyoqIEdldCB0aGUgU2VydmVyIExhbWJkYSBmdW5jdGlvbiAqL1xuICBnZXRTZXJ2ZXIoKTogTGFtYmRhQ29tcHV0ZTtcblxuICAvKiogR2V0IHRoZSBJbWFnZSBPcHRpbWlzYXRpb24gTGFtYmRhIGZ1bmN0aW9uICovXG4gIGdldEltYWdlT3B0aW1pc2F0aW9uKCk6IExhbWJkYUNvbXB1dGU7XG5cbiAgLyoqIEdldCB0aGUgUmV2YWxpZGF0aW9uIExhbWJkYSBmdW5jdGlvbiAqL1xuICBnZXRSZXZhbGlkYXRpb24oKTogTGFtYmRhQ29tcHV0ZTtcblxuICAvKiogR2V0IHRoZSBBc3NldHMgUzMgYnVja2V0IChzdGF0aWMgZmlsZXMpICovXG4gIGdldEFzc2V0c0J1Y2tldCgpOiBQcml2YXRlU3RvcmFnZTtcblxuICAvKiogR2V0IHRoZSBDYWNoZSBTMyBidWNrZXQgKElTUiBjYWNoZSkgKi9cbiAgZ2V0Q2FjaGVCdWNrZXQoKTogUHJpdmF0ZVN0b3JhZ2U7XG5cbiAgLyoqIEdldCB0aGUgTWVkaWEgUzMgYnVja2V0ICh1cGxvYWRzKSAqL1xuICBnZXRNZWRpYUJ1Y2tldCgpOiBQcml2YXRlU3RvcmFnZTtcblxuICAvKiogR2V0IHRoZSBUYWcgQ2FjaGUgRHluYW1vREIgdGFibGUgKi9cbiAgZ2V0VGFnQ2FjaGUoKTogRHluYW1vREJEYXRhYmFzZTtcblxuICAvKiogR2V0IHRoZSBSZXZhbGlkYXRpb24gU1FTIHF1ZXVlICovXG4gIGdldFJldmFsaWRhdGlvblF1ZXVlKCk6IFF1ZXVlTWVzc2FnaW5nO1xuXG4gIC8qKiBHZXQgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uICovXG4gIGdldENkbigpOiBDZG47XG59XG5cbi8qKlxuICogVW5pb24gdHlwZSByZXByZXNlbnRpbmcgYW55IHBhdHRlcm4gaW50ZXJmYWNlLlxuICogVXNlIHdpdGggdHlwZSBndWFyZHMgZm9yIGdlbmVyaWMgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIEFueVBhdHRlcm4gPSBJUGF5bG9hZDsgLy8gfCBJTmV4dGpzIHwgSVJlbWl4IGluIGZ1dHVyZVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSBwYXR0ZXJuIGlzIFBheWxvYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BheWxvYWRQYXR0ZXJuKHBhdHRlcm46IElQYXR0ZXJuKTogcGF0dGVybiBpcyBJUGF5bG9hZCB7XG4gIHJldHVybiBwYXR0ZXJuLnBhdHRlcm5UeXBlID09PSBcInBheWxvYWRcIjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgcmVzb3VyY2UgaXMgYW55IHBhdHRlcm4gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF0dGVybihyZXNvdXJjZTogdW5rbm93bik6IHJlc291cmNlIGlzIElQYXR0ZXJuIHtcbiAgcmV0dXJuIChcbiAgICByZXNvdXJjZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiByZXNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwicGF0dGVyblR5cGVcIiBpbiByZXNvdXJjZSAmJlxuICAgIHR5cGVvZiAocmVzb3VyY2UgYXMgSVBhdHRlcm4pLnBhdHRlcm5UeXBlID09PSBcInN0cmluZ1wiXG4gICk7XG59XG4iXX0=
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe storage interfaces.
|
|
3
|
+
*
|
|
4
|
+
* These interfaces provide compile-time type safety for storage resources.
|
|
5
|
+
* All S3 bucket types are grouped under the Storage umbrella, with specific
|
|
6
|
+
* interfaces for each bucket type.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
|
|
10
|
+
* assets.getBucketName(); // ✓ Available on all storage types
|
|
11
|
+
*
|
|
12
|
+
* const website = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
|
|
13
|
+
* website.getWebsiteUrl(); // ✓ Available on IWebsiteStorage
|
|
14
|
+
*/
|
|
15
|
+
import { type IBucket, type EventType, type IBucketNotificationDestination, type NotificationKeyFilter } from "aws-cdk-lib/aws-s3";
|
|
16
|
+
import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
|
|
17
|
+
import { type Construct } from "constructs";
|
|
18
|
+
/**
|
|
19
|
+
* Storage type discriminator.
|
|
20
|
+
* Maps to S3 bucket configurations.
|
|
21
|
+
*/
|
|
22
|
+
export type StorageType = "private" | "website" | "publicRead";
|
|
23
|
+
/**
|
|
24
|
+
* Base storage interface.
|
|
25
|
+
* All storage types implement this interface.
|
|
26
|
+
*/
|
|
27
|
+
export interface IStorage {
|
|
28
|
+
/** The type of storage resource. Used for runtime type narrowing. */
|
|
29
|
+
readonly storageType: StorageType;
|
|
30
|
+
/** The underlying CDK construct node. */
|
|
31
|
+
readonly node: Construct["node"];
|
|
32
|
+
/** Get the underlying S3 bucket. */
|
|
33
|
+
getBucket(): IBucket;
|
|
34
|
+
/** Get the bucket ARN. */
|
|
35
|
+
getBucketArn(): string;
|
|
36
|
+
/** Get the bucket name. */
|
|
37
|
+
getBucketName(): string;
|
|
38
|
+
/** Get the bucket domain name. */
|
|
39
|
+
getBucketDomainName(): string;
|
|
40
|
+
/** Get the regional bucket domain name. */
|
|
41
|
+
getBucketRegionalDomainName(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Grant read permissions to a grantee.
|
|
44
|
+
* @param grantee The principal to grant read permissions to
|
|
45
|
+
*/
|
|
46
|
+
grantRead(grantee: IGrantable): Grant;
|
|
47
|
+
/**
|
|
48
|
+
* Grant write permissions to a grantee.
|
|
49
|
+
* @param grantee The principal to grant write permissions to
|
|
50
|
+
*/
|
|
51
|
+
grantWrite(grantee: IGrantable): Grant;
|
|
52
|
+
/**
|
|
53
|
+
* Grant read and write permissions to a grantee.
|
|
54
|
+
* @param grantee The principal to grant permissions to
|
|
55
|
+
*/
|
|
56
|
+
grantReadWrite(grantee: IGrantable): Grant;
|
|
57
|
+
/**
|
|
58
|
+
* Grant delete permissions to a grantee.
|
|
59
|
+
* @param grantee The principal to grant delete permissions to
|
|
60
|
+
*/
|
|
61
|
+
grantDelete(grantee: IGrantable): Grant;
|
|
62
|
+
/**
|
|
63
|
+
* Grant put permissions to a grantee.
|
|
64
|
+
* @param grantee The principal to grant put permissions to
|
|
65
|
+
*/
|
|
66
|
+
grantPut(grantee: IGrantable): Grant;
|
|
67
|
+
/**
|
|
68
|
+
* Add an event notification to the bucket.
|
|
69
|
+
* @param event The event type to trigger on
|
|
70
|
+
* @param dest The notification destination
|
|
71
|
+
* @param filters Optional key filters
|
|
72
|
+
*/
|
|
73
|
+
addEventNotification(event: EventType, dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
74
|
+
/**
|
|
75
|
+
* Add an object created notification.
|
|
76
|
+
* @param dest The notification destination
|
|
77
|
+
* @param filters Optional key filters
|
|
78
|
+
*/
|
|
79
|
+
addObjectCreatedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
80
|
+
/**
|
|
81
|
+
* Add an object removed notification.
|
|
82
|
+
* @param dest The notification destination
|
|
83
|
+
* @param filters Optional key filters
|
|
84
|
+
*/
|
|
85
|
+
addObjectRemovedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Private storage interface.
|
|
89
|
+
* Standard S3 bucket with optional encryption and versioning.
|
|
90
|
+
*/
|
|
91
|
+
export interface IPrivateStorage extends IStorage {
|
|
92
|
+
readonly storageType: "private";
|
|
93
|
+
/**
|
|
94
|
+
* Grant public access to objects under a prefix.
|
|
95
|
+
* Use with caution - makes objects publicly readable.
|
|
96
|
+
* @param keyPrefix Key prefixes to grant public access to
|
|
97
|
+
*/
|
|
98
|
+
grantPublicAccess(...keyPrefix: string[]): Grant;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Website storage interface.
|
|
102
|
+
* S3 bucket configured for static website hosting.
|
|
103
|
+
*/
|
|
104
|
+
export interface IWebsiteStorage extends IStorage {
|
|
105
|
+
readonly storageType: "website";
|
|
106
|
+
/** Get the website URL. */
|
|
107
|
+
getWebsiteUrl(): string;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Public read storage interface.
|
|
111
|
+
* S3 bucket with public read access enabled.
|
|
112
|
+
*/
|
|
113
|
+
export interface IPublicStorage extends IStorage {
|
|
114
|
+
readonly storageType: "publicRead";
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Union type representing any storage interface.
|
|
118
|
+
* Use with type guards for generic handling.
|
|
119
|
+
*/
|
|
120
|
+
export type AnyStorage = IPrivateStorage | IWebsiteStorage | IPublicStorage;
|
|
121
|
+
/**
|
|
122
|
+
* Type guard to check if a storage is private.
|
|
123
|
+
*/
|
|
124
|
+
export declare function isPrivateStorage(storage: IStorage): storage is IPrivateStorage;
|
|
125
|
+
/**
|
|
126
|
+
* Type guard to check if a storage is a website bucket.
|
|
127
|
+
*/
|
|
128
|
+
export declare function isWebsiteStorage(storage: IStorage): storage is IWebsiteStorage;
|
|
129
|
+
/**
|
|
130
|
+
* Type guard to check if a storage is public read.
|
|
131
|
+
*/
|
|
132
|
+
export declare function isPublicStorage(storage: IStorage): storage is IPublicStorage;
|
|
133
|
+
/**
|
|
134
|
+
* Type guard to check if a resource is any storage type.
|
|
135
|
+
*/
|
|
136
|
+
export declare function isStorage(resource: unknown): resource is IStorage;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type-safe storage interfaces.
|
|
4
|
+
*
|
|
5
|
+
* These interfaces provide compile-time type safety for storage resources.
|
|
6
|
+
* All S3 bucket types are grouped under the Storage umbrella, with specific
|
|
7
|
+
* interfaces for each bucket type.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
|
|
11
|
+
* assets.getBucketName(); // ✓ Available on all storage types
|
|
12
|
+
*
|
|
13
|
+
* const website = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
|
|
14
|
+
* website.getWebsiteUrl(); // ✓ Available on IWebsiteStorage
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.isPrivateStorage = isPrivateStorage;
|
|
18
|
+
exports.isWebsiteStorage = isWebsiteStorage;
|
|
19
|
+
exports.isPublicStorage = isPublicStorage;
|
|
20
|
+
exports.isStorage = isStorage;
|
|
21
|
+
/**
|
|
22
|
+
* Type guard to check if a storage is private.
|
|
23
|
+
*/
|
|
24
|
+
function isPrivateStorage(storage) {
|
|
25
|
+
return storage.storageType === "private";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Type guard to check if a storage is a website bucket.
|
|
29
|
+
*/
|
|
30
|
+
function isWebsiteStorage(storage) {
|
|
31
|
+
return storage.storageType === "website";
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Type guard to check if a storage is public read.
|
|
35
|
+
*/
|
|
36
|
+
function isPublicStorage(storage) {
|
|
37
|
+
return storage.storageType === "publicRead";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Type guard to check if a resource is any storage type.
|
|
41
|
+
*/
|
|
42
|
+
function isStorage(resource) {
|
|
43
|
+
return (resource !== null &&
|
|
44
|
+
typeof resource === "object" &&
|
|
45
|
+
"storageType" in resource &&
|
|
46
|
+
typeof resource.storageType === "string");
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvaW50ZXJmYWNlcy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHOztBQXFKSCw0Q0FJQztBQUtELDRDQUlDO0FBS0QsMENBRUM7QUFLRCw4QkFPQztBQW5DRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixPQUFpQjtJQUVqQixPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixPQUFpQjtJQUVqQixPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxPQUFpQjtJQUMvQyxPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDO0FBQzlDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxRQUFpQjtJQUN6QyxPQUFPLENBQ0wsUUFBUSxLQUFLLElBQUk7UUFDakIsT0FBTyxRQUFRLEtBQUssUUFBUTtRQUM1QixhQUFhLElBQUksUUFBUTtRQUN6QixPQUFRLFFBQXFCLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FDdkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUtc2FmZSBzdG9yYWdlIGludGVyZmFjZXMuXG4gKlxuICogVGhlc2UgaW50ZXJmYWNlcyBwcm92aWRlIGNvbXBpbGUtdGltZSB0eXBlIHNhZmV0eSBmb3Igc3RvcmFnZSByZXNvdXJjZXMuXG4gKiBBbGwgUzMgYnVja2V0IHR5cGVzIGFyZSBncm91cGVkIHVuZGVyIHRoZSBTdG9yYWdlIHVtYnJlbGxhLCB3aXRoIHNwZWNpZmljXG4gKiBpbnRlcmZhY2VzIGZvciBlYWNoIGJ1Y2tldCB0eXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhc3NldHMgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIkFzc2V0c1wiLCB7IGJ1Y2tldFR5cGU6IFwicHJpdmF0ZVwiIH0pKTtcbiAqIGFzc2V0cy5nZXRCdWNrZXROYW1lKCk7IC8vIOKckyBBdmFpbGFibGUgb24gYWxsIHN0b3JhZ2UgdHlwZXNcbiAqXG4gKiBjb25zdCB3ZWJzaXRlID0gYXBwLmFkZFN0b3JhZ2UoU3RvcmFnZUZhY3RvcnkuYnVpbGQoXCJTaXRlXCIsIHsgYnVja2V0VHlwZTogXCJ3ZWJzaXRlXCIgfSkpO1xuICogd2Vic2l0ZS5nZXRXZWJzaXRlVXJsKCk7IC8vIOKckyBBdmFpbGFibGUgb24gSVdlYnNpdGVTdG9yYWdlXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBJQnVja2V0LFxuICB0eXBlIEV2ZW50VHlwZSxcbiAgdHlwZSBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gIHR5cGUgTm90aWZpY2F0aW9uS2V5RmlsdGVyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IHR5cGUgSUdyYW50YWJsZSwgdHlwZSBHcmFudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbi8qKlxuICogU3RvcmFnZSB0eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBNYXBzIHRvIFMzIGJ1Y2tldCBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcmFnZVR5cGUgPSBcInByaXZhdGVcIiB8IFwid2Vic2l0ZVwiIHwgXCJwdWJsaWNSZWFkXCI7XG5cbi8qKlxuICogQmFzZSBzdG9yYWdlIGludGVyZmFjZS5cbiAqIEFsbCBzdG9yYWdlIHR5cGVzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3RvcmFnZSB7XG4gIC8qKiBUaGUgdHlwZSBvZiBzdG9yYWdlIHJlc291cmNlLiBVc2VkIGZvciBydW50aW1lIHR5cGUgbmFycm93aW5nLiAqL1xuICByZWFkb25seSBzdG9yYWdlVHlwZTogU3RvcmFnZVR5cGU7XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIENESyBjb25zdHJ1Y3Qgbm9kZS4gKi9cbiAgcmVhZG9ubHkgbm9kZTogQ29uc3RydWN0W1wibm9kZVwiXTtcblxuICAvKiogR2V0IHRoZSB1bmRlcmx5aW5nIFMzIGJ1Y2tldC4gKi9cbiAgZ2V0QnVja2V0KCk6IElCdWNrZXQ7XG5cbiAgLyoqIEdldCB0aGUgYnVja2V0IEFSTi4gKi9cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZztcblxuICAvKiogR2V0IHRoZSBidWNrZXQgbmFtZS4gKi9cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmc7XG5cbiAgLyoqIEdldCB0aGUgYnVja2V0IGRvbWFpbiBuYW1lLiAqL1xuICBnZXRCdWNrZXREb21haW5OYW1lKCk6IHN0cmluZztcblxuICAvKiogR2V0IHRoZSByZWdpb25hbCBidWNrZXQgZG9tYWluIG5hbWUuICovXG4gIGdldEJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHdyaXRlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCBkZWxldGUgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGRlbGV0ZSBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnREZWxldGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCBwdXQgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHB1dCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnRQdXQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbm90aWZpY2F0aW9uIHRvIHRoZSBidWNrZXQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdHlwZSB0byB0cmlnZ2VyIG9uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb25cbiAgICogQHBhcmFtIGZpbHRlcnMgT3B0aW9uYWwga2V5IGZpbHRlcnNcbiAgICovXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvYmplY3QgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb25cbiAgICogQHBhcmFtIGZpbHRlcnMgT3B0aW9uYWwga2V5IGZpbHRlcnNcbiAgICovXG4gIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvYmplY3QgcmVtb3ZlZCBub3RpZmljYXRpb24uXG4gICAqIEBwYXJhbSBkZXN0IFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb25cbiAgICogQHBhcmFtIGZpbHRlcnMgT3B0aW9uYWwga2V5IGZpbHRlcnNcbiAgICovXG4gIGFkZE9iamVjdFJlbW92ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQ7XG59XG5cbi8qKlxuICogUHJpdmF0ZSBzdG9yYWdlIGludGVyZmFjZS5cbiAqIFN0YW5kYXJkIFMzIGJ1Y2tldCB3aXRoIG9wdGlvbmFsIGVuY3J5cHRpb24gYW5kIHZlcnNpb25pbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByaXZhdGVTdG9yYWdlIGV4dGVuZHMgSVN0b3JhZ2Uge1xuICByZWFkb25seSBzdG9yYWdlVHlwZTogXCJwcml2YXRlXCI7XG5cbiAgLyoqXG4gICAqIEdyYW50IHB1YmxpYyBhY2Nlc3MgdG8gb2JqZWN0cyB1bmRlciBhIHByZWZpeC5cbiAgICogVXNlIHdpdGggY2F1dGlvbiAtIG1ha2VzIG9iamVjdHMgcHVibGljbHkgcmVhZGFibGUuXG4gICAqIEBwYXJhbSBrZXlQcmVmaXggS2V5IHByZWZpeGVzIHRvIGdyYW50IHB1YmxpYyBhY2Nlc3MgdG9cbiAgICovXG4gIGdyYW50UHVibGljQWNjZXNzKC4uLmtleVByZWZpeDogc3RyaW5nW10pOiBHcmFudDtcbn1cblxuLyoqXG4gKiBXZWJzaXRlIHN0b3JhZ2UgaW50ZXJmYWNlLlxuICogUzMgYnVja2V0IGNvbmZpZ3VyZWQgZm9yIHN0YXRpYyB3ZWJzaXRlIGhvc3RpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYnNpdGVTdG9yYWdlIGV4dGVuZHMgSVN0b3JhZ2Uge1xuICByZWFkb25seSBzdG9yYWdlVHlwZTogXCJ3ZWJzaXRlXCI7XG5cbiAgLyoqIEdldCB0aGUgd2Vic2l0ZSBVUkwuICovXG4gIGdldFdlYnNpdGVVcmwoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB1YmxpYyByZWFkIHN0b3JhZ2UgaW50ZXJmYWNlLlxuICogUzMgYnVja2V0IHdpdGggcHVibGljIHJlYWQgYWNjZXNzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVB1YmxpY1N0b3JhZ2UgZXh0ZW5kcyBJU3RvcmFnZSB7XG4gIHJlYWRvbmx5IHN0b3JhZ2VUeXBlOiBcInB1YmxpY1JlYWRcIjtcbn1cblxuLyoqXG4gKiBVbmlvbiB0eXBlIHJlcHJlc2VudGluZyBhbnkgc3RvcmFnZSBpbnRlcmZhY2UuXG4gKiBVc2Ugd2l0aCB0eXBlIGd1YXJkcyBmb3IgZ2VuZXJpYyBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IHR5cGUgQW55U3RvcmFnZSA9IElQcml2YXRlU3RvcmFnZSB8IElXZWJzaXRlU3RvcmFnZSB8IElQdWJsaWNTdG9yYWdlO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSBzdG9yYWdlIGlzIHByaXZhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVTdG9yYWdlKFxuICBzdG9yYWdlOiBJU3RvcmFnZVxuKTogc3RvcmFnZSBpcyBJUHJpdmF0ZVN0b3JhZ2Uge1xuICByZXR1cm4gc3RvcmFnZS5zdG9yYWdlVHlwZSA9PT0gXCJwcml2YXRlXCI7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHN0b3JhZ2UgaXMgYSB3ZWJzaXRlIGJ1Y2tldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2Vic2l0ZVN0b3JhZ2UoXG4gIHN0b3JhZ2U6IElTdG9yYWdlXG4pOiBzdG9yYWdlIGlzIElXZWJzaXRlU3RvcmFnZSB7XG4gIHJldHVybiBzdG9yYWdlLnN0b3JhZ2VUeXBlID09PSBcIndlYnNpdGVcIjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgc3RvcmFnZSBpcyBwdWJsaWMgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGljU3RvcmFnZShzdG9yYWdlOiBJU3RvcmFnZSk6IHN0b3JhZ2UgaXMgSVB1YmxpY1N0b3JhZ2Uge1xuICByZXR1cm4gc3RvcmFnZS5zdG9yYWdlVHlwZSA9PT0gXCJwdWJsaWNSZWFkXCI7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHJlc291cmNlIGlzIGFueSBzdG9yYWdlIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0b3JhZ2UocmVzb3VyY2U6IHVua25vd24pOiByZXNvdXJjZSBpcyBJU3RvcmFnZSB7XG4gIHJldHVybiAoXG4gICAgcmVzb3VyY2UgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgcmVzb3VyY2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInN0b3JhZ2VUeXBlXCIgaW4gcmVzb3VyY2UgJiZcbiAgICB0eXBlb2YgKHJlc291cmNlIGFzIElTdG9yYWdlKS5zdG9yYWdlVHlwZSA9PT0gXCJzdHJpbmdcIlxuICApO1xufVxuIl19
|