@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.
Files changed (112) hide show
  1. package/README.md +3 -3
  2. package/dist/lib/app.d.ts +166 -6
  3. package/dist/lib/app.js +212 -20
  4. package/dist/lib/aspects/resourceInventory.d.ts +4 -4
  5. package/dist/lib/aspects/resourceInventory.js +3 -3
  6. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  7. package/dist/lib/config/aws/identityCenter.js +1 -5
  8. package/dist/lib/config/aws/organisation.js +1 -4
  9. package/dist/lib/index.d.ts +1 -0
  10. package/dist/lib/index.js +7 -1
  11. package/dist/lib/patterns/aws/buildkite.js +3 -2
  12. package/dist/lib/patterns/aws/cdn.d.ts +164 -0
  13. package/dist/lib/patterns/aws/cdn.js +264 -0
  14. package/dist/lib/patterns/aws/compute.d.ts +278 -59
  15. package/dist/lib/patterns/aws/compute.js +384 -188
  16. package/dist/lib/patterns/aws/connections.d.ts +46 -0
  17. package/dist/lib/patterns/aws/connections.js +159 -0
  18. package/dist/lib/patterns/aws/database.d.ts +124 -11
  19. package/dist/lib/patterns/aws/database.js +188 -66
  20. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  21. package/dist/lib/patterns/aws/index.d.ts +3 -0
  22. package/dist/lib/patterns/aws/index.js +4 -1
  23. package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
  24. package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
  25. package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
  26. package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
  27. package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
  28. package/dist/lib/patterns/aws/interfaces/database.js +65 -0
  29. package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
  30. package/dist/lib/patterns/aws/interfaces/index.js +49 -0
  31. package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
  32. package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
  33. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
  34. package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
  35. package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
  36. package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
  37. package/dist/lib/patterns/aws/messaging.d.ts +183 -0
  38. package/dist/lib/patterns/aws/messaging.js +239 -0
  39. package/dist/lib/patterns/aws/network.js +4 -4
  40. package/dist/lib/patterns/aws/pattern.d.ts +67 -0
  41. package/dist/lib/patterns/aws/pattern.js +69 -0
  42. package/dist/lib/patterns/aws/payload.d.ts +87 -0
  43. package/dist/lib/patterns/aws/payload.js +526 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +127 -15
  45. package/dist/lib/patterns/aws/storage.js +234 -38
  46. package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
  47. package/dist/lib/resources/aws/backup/backupVault.js +1 -2
  48. package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
  49. package/dist/lib/resources/aws/base/awsStack.js +1 -7
  50. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
  51. package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
  52. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/cdn/index.js +18 -0
  54. package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
  55. package/dist/lib/resources/aws/compute/ec2.js +33 -6
  56. package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
  57. package/dist/lib/resources/aws/compute/ecs.js +31 -115
  58. package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
  59. package/dist/lib/resources/aws/compute/lambda.js +209 -32
  60. package/dist/lib/resources/aws/database/database.js +1 -1
  61. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  62. package/dist/lib/resources/aws/database/dynamodb.js +181 -0
  63. package/dist/lib/resources/aws/database/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/database/index.js +2 -1
  65. package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
  66. package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
  67. package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
  68. package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
  69. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
  70. package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
  71. package/dist/lib/resources/aws/index.d.ts +2 -0
  72. package/dist/lib/resources/aws/index.js +3 -1
  73. package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
  74. package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
  75. package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
  76. package/dist/lib/resources/aws/messaging/index.js +20 -0
  77. package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
  78. package/dist/lib/resources/aws/messaging/sns.js +70 -0
  79. package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
  80. package/dist/lib/resources/aws/messaging/sqs.js +231 -0
  81. package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
  82. package/dist/lib/resources/aws/messaging/utils.js +7 -0
  83. package/dist/lib/resources/aws/networking/ipam.js +1 -2
  84. package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
  85. package/dist/lib/resources/aws/networking/vpc.js +1 -2
  86. package/dist/lib/resources/aws/storage/ecr.js +8 -5
  87. package/dist/lib/resources/aws/storage/s3.js +1 -2
  88. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  89. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  90. package/dist/lib/utils/getConfig.js +3 -2
  91. package/dist/lib/utils/index.d.ts +1 -0
  92. package/dist/lib/utils/index.js +2 -1
  93. package/dist/lib/utils/manifestWriter.d.ts +174 -0
  94. package/dist/lib/utils/manifestWriter.js +233 -0
  95. package/dist/lib/utils/standardTagsAspect.js +1 -8
  96. package/dist/lib/utils/validationLogger.d.ts +34 -0
  97. package/dist/lib/utils/validationLogger.js +83 -0
  98. package/package.json +3 -3
  99. package/dist/lib/__tests__/setup.d.ts +0 -48
  100. package/dist/lib/__tests__/setup.js +0 -1
  101. package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
  102. package/dist/lib/patterns/aws/cicdRole.js +0 -68
  103. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
  104. package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
  105. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
  106. package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
  107. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
  108. package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
  109. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
  110. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
  111. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
  112. 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