@composurecdk/s3 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/commonjs/alarm-config.d.ts.map +1 -0
  2. package/dist/commonjs/alarm-config.js +3 -0
  3. package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
  4. package/dist/commonjs/alarm-defaults.d.ts.map +1 -0
  5. package/dist/commonjs/alarm-defaults.js +27 -0
  6. package/dist/commonjs/alarm-defaults.js.map +1 -0
  7. package/dist/commonjs/bucket-alarms.d.ts.map +1 -0
  8. package/dist/commonjs/bucket-alarms.js +100 -0
  9. package/dist/commonjs/bucket-alarms.js.map +1 -0
  10. package/dist/{bucket-builder.d.ts → commonjs/bucket-builder.d.ts} +5 -2
  11. package/dist/commonjs/bucket-builder.d.ts.map +1 -0
  12. package/dist/commonjs/bucket-builder.js +118 -0
  13. package/dist/commonjs/bucket-builder.js.map +1 -0
  14. package/dist/{bucket-deployment-builder.d.ts → commonjs/bucket-deployment-builder.d.ts} +5 -2
  15. package/dist/commonjs/bucket-deployment-builder.d.ts.map +1 -0
  16. package/dist/commonjs/bucket-deployment-builder.js +116 -0
  17. package/dist/commonjs/bucket-deployment-builder.js.map +1 -0
  18. package/dist/commonjs/bucket-deployment-defaults.d.ts.map +1 -0
  19. package/dist/commonjs/bucket-deployment-defaults.js +68 -0
  20. package/dist/commonjs/bucket-deployment-defaults.js.map +1 -0
  21. package/dist/commonjs/bucket-deployment-props.d.ts.map +1 -0
  22. package/dist/commonjs/bucket-deployment-props.js +3 -0
  23. package/dist/commonjs/bucket-deployment-props.js.map +1 -0
  24. package/dist/commonjs/defaults.d.ts.map +1 -0
  25. package/dist/commonjs/defaults.js +118 -0
  26. package/dist/commonjs/defaults.js.map +1 -0
  27. package/dist/commonjs/index.d.ts.map +1 -0
  28. package/dist/commonjs/index.js +16 -0
  29. package/dist/commonjs/index.js.map +1 -0
  30. package/dist/commonjs/package.json +3 -0
  31. package/dist/esm/alarm-config.d.ts +48 -0
  32. package/dist/esm/alarm-config.d.ts.map +1 -0
  33. package/dist/esm/alarm-config.js.map +1 -0
  34. package/dist/esm/alarm-defaults.d.ts +14 -0
  35. package/dist/esm/alarm-defaults.d.ts.map +1 -0
  36. package/dist/esm/alarm-defaults.js.map +1 -0
  37. package/dist/esm/bucket-alarms.d.ts +34 -0
  38. package/dist/esm/bucket-alarms.d.ts.map +1 -0
  39. package/dist/esm/bucket-alarms.js.map +1 -0
  40. package/dist/esm/bucket-builder.d.ts +130 -0
  41. package/dist/esm/bucket-builder.d.ts.map +1 -0
  42. package/dist/{bucket-builder.js → esm/bucket-builder.js} +7 -2
  43. package/dist/esm/bucket-builder.js.map +1 -0
  44. package/dist/esm/bucket-deployment-builder.d.ts +113 -0
  45. package/dist/esm/bucket-deployment-builder.d.ts.map +1 -0
  46. package/dist/{bucket-deployment-builder.js → esm/bucket-deployment-builder.js} +8 -2
  47. package/dist/esm/bucket-deployment-builder.js.map +1 -0
  48. package/dist/esm/bucket-deployment-defaults.d.ts +51 -0
  49. package/dist/esm/bucket-deployment-defaults.d.ts.map +1 -0
  50. package/dist/esm/bucket-deployment-defaults.js.map +1 -0
  51. package/dist/esm/bucket-deployment-props.d.ts +18 -0
  52. package/dist/esm/bucket-deployment-props.d.ts.map +1 -0
  53. package/dist/esm/bucket-deployment-props.js.map +1 -0
  54. package/dist/esm/defaults.d.ts +28 -0
  55. package/dist/esm/defaults.d.ts.map +1 -0
  56. package/dist/esm/defaults.js.map +1 -0
  57. package/dist/esm/index.d.ts +8 -0
  58. package/dist/esm/index.d.ts.map +1 -0
  59. package/dist/esm/index.js.map +1 -0
  60. package/dist/esm/package.json +3 -0
  61. package/package.json +36 -17
  62. package/dist/alarm-config.d.ts.map +0 -1
  63. package/dist/alarm-defaults.d.ts.map +0 -1
  64. package/dist/alarm-defaults.js.map +0 -1
  65. package/dist/bucket-alarms.d.ts.map +0 -1
  66. package/dist/bucket-alarms.js.map +0 -1
  67. package/dist/bucket-builder.d.ts.map +0 -1
  68. package/dist/bucket-builder.js.map +0 -1
  69. package/dist/bucket-deployment-builder.d.ts.map +0 -1
  70. package/dist/bucket-deployment-builder.js.map +0 -1
  71. package/dist/bucket-deployment-defaults.d.ts.map +0 -1
  72. package/dist/bucket-deployment-defaults.js.map +0 -1
  73. package/dist/bucket-deployment-props.d.ts.map +0 -1
  74. package/dist/bucket-deployment-props.js.map +0 -1
  75. package/dist/defaults.d.ts.map +0 -1
  76. package/dist/defaults.js.map +0 -1
  77. package/dist/index.d.ts.map +0 -1
  78. package/dist/index.js.map +0 -1
  79. /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
  80. /package/dist/{alarm-defaults.d.ts → commonjs/alarm-defaults.d.ts} +0 -0
  81. /package/dist/{bucket-alarms.d.ts → commonjs/bucket-alarms.d.ts} +0 -0
  82. /package/dist/{bucket-deployment-defaults.d.ts → commonjs/bucket-deployment-defaults.d.ts} +0 -0
  83. /package/dist/{bucket-deployment-props.d.ts → commonjs/bucket-deployment-props.d.ts} +0 -0
  84. /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
  85. /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
  86. /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
  87. /package/dist/{alarm-defaults.js → esm/alarm-defaults.js} +0 -0
  88. /package/dist/{bucket-alarms.js → esm/bucket-alarms.js} +0 -0
  89. /package/dist/{bucket-deployment-defaults.js → esm/bucket-deployment-defaults.js} +0 -0
  90. /package/dist/{bucket-deployment-props.js → esm/bucket-deployment-props.js} +0 -0
  91. /package/dist/{defaults.js → esm/defaults.js} +0 -0
  92. /package/dist/{index.js → esm/index.js} +0 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUCKET_DEFAULTS = exports.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES = exports.DEFAULT_BUCKET_LIFECYCLE_RULES = void 0;
4
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ /**
7
+ * Aborts multipart uploads that have not completed within 7 days. AWS recommends
8
+ * this rule on every bucket — orphaned upload parts are billed as storage but
9
+ * never become objects, so the rule is pure cost hygiene with no functional
10
+ * downside.
11
+ *
12
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html
13
+ */
14
+ const ABORT_INCOMPLETE_MULTIPART_UPLOADS = {
15
+ id: "AbortIncompleteMultipartUploadAfter7Days",
16
+ abortIncompleteMultipartUploadAfter: aws_cdk_lib_1.Duration.days(7),
17
+ };
18
+ /**
19
+ * Lifecycle rules applied to general-purpose buckets built with
20
+ * {@link createBucketBuilder}. Bounds storage cost from orphaned multipart
21
+ * parts and from accumulated noncurrent versions of objects in versioned
22
+ * buckets, while preserving a generous recovery window.
23
+ *
24
+ * Users who need different rules can override the entire set via the
25
+ * `.lifecycleRules([...])` builder method.
26
+ */
27
+ exports.DEFAULT_BUCKET_LIFECYCLE_RULES = [
28
+ ABORT_INCOMPLETE_MULTIPART_UPLOADS,
29
+ {
30
+ /**
31
+ * Buckets default to `versioned: true`, so replaced and deleted objects
32
+ * accumulate as noncurrent versions indefinitely. Expiring them after a
33
+ * year preserves a long recovery window for "oops" deletions while
34
+ * preventing unbounded storage growth.
35
+ *
36
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-examples.html
37
+ */
38
+ id: "ExpireNoncurrentVersionsAfter365Days",
39
+ noncurrentVersionExpiration: aws_cdk_lib_1.Duration.days(365),
40
+ },
41
+ ];
42
+ /**
43
+ * Lifecycle rules applied to auto-created S3 server access log buckets and
44
+ * CloudFront access log buckets. Mirrors the 2-year retention used by
45
+ * {@link LOG_GROUP_DEFAULTS} so the audit window is consistent across log
46
+ * destinations in the library.
47
+ *
48
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_detect_investigate_events_app_service_logging.html
49
+ */
50
+ exports.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES = [
51
+ ABORT_INCOMPLETE_MULTIPART_UPLOADS,
52
+ {
53
+ id: "ExpireAccessLogsAfter2Years",
54
+ expiration: aws_cdk_lib_1.Duration.days(731),
55
+ },
56
+ ];
57
+ /**
58
+ * Secure, AWS-recommended defaults applied to every S3 bucket built
59
+ * with {@link createBucketBuilder}. Each property can be individually
60
+ * overridden via the builder's fluent API.
61
+ */
62
+ exports.BUCKET_DEFAULTS = {
63
+ /**
64
+ * Auto-create a dedicated logging bucket and write S3 server access logs
65
+ * to it under the `logs/` prefix. Access logging provides an audit trail
66
+ * of all object-level operations for security monitoring and
67
+ * troubleshooting.
68
+ *
69
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_detect_investigate_events_app_service_logging.html
70
+ */
71
+ serverAccessLogs: { prefix: "logs/" },
72
+ /**
73
+ * Block all public access to the bucket. S3 buckets should not be
74
+ * publicly accessible unless explicitly required (e.g. static website
75
+ * hosting via CloudFront OAC).
76
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html
77
+ */
78
+ blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
79
+ /**
80
+ * Enable server-side encryption with S3-managed keys (SSE-S3).
81
+ * This is the default and lowest-cost encryption option.
82
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/protecting-data-at-rest.html
83
+ */
84
+ encryption: aws_s3_1.BucketEncryption.S3_MANAGED,
85
+ /**
86
+ * Enforce SSL/TLS for all requests to the bucket.
87
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html
88
+ */
89
+ enforceSSL: true,
90
+ /**
91
+ * Enable versioning to protect against accidental deletions and
92
+ * support rollback.
93
+ * @see https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html
94
+ */
95
+ versioned: true,
96
+ /**
97
+ * Bound storage cost on every bucket: abort orphaned multipart uploads
98
+ * after 7 days and expire noncurrent object versions after 365 days.
99
+ *
100
+ * Override with `.lifecycleRules([...])` to supply your own rule set —
101
+ * the array is replaced wholesale, consistent with how every other
102
+ * builder default is overridden.
103
+ *
104
+ * @see {@link DEFAULT_BUCKET_LIFECYCLE_RULES}
105
+ */
106
+ lifecycleRules: exports.DEFAULT_BUCKET_LIFECYCLE_RULES,
107
+ /**
108
+ * Retain the bucket on stack deletion to prevent data loss.
109
+ *
110
+ * When overridden to `RemovalPolicy.DESTROY`, the builder automatically
111
+ * enables `autoDeleteObjects` (unless explicitly set to `false`) so that
112
+ * non-empty buckets can be cleanly removed during stack deletion.
113
+ *
114
+ * @see https://docs.aws.amazon.com/cdk/v2/guide/resources.html#resources_removal
115
+ */
116
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
117
+ };
118
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";;;AAAA,+CAA6F;AAC7F,6CAAsD;AAGtD;;;;;;;GAOG;AACH,MAAM,kCAAkC,GAAkB;IACxD,EAAE,EAAE,0CAA0C;IAC9C,mCAAmC,EAAE,sBAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;GAQG;AACU,QAAA,8BAA8B,GAAoB;IAC7D,kCAAkC;IAClC;QACE;;;;;;;WAOG;QACH,EAAE,EAAE,sCAAsC;QAC1C,2BAA2B,EAAE,sBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;KAChD;CACF,CAAC;AAEF;;;;;;;GAOG;AACU,QAAA,yCAAyC,GAAoB;IACxE,kCAAkC;IAClC;QACE,EAAE,EAAE,6BAA6B;QACjC,UAAU,EAAE,sBAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/B;CACF,CAAC;AAEF;;;;GAIG;AACU,QAAA,eAAe,GAAgC;IAC1D;;;;;;;OAOG;IACH,gBAAgB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAErC;;;;;OAKG;IACH,iBAAiB,EAAE,0BAAiB,CAAC,SAAS;IAE9C;;;;OAIG;IACH,UAAU,EAAE,yBAAgB,CAAC,UAAU;IAEvC;;;OAGG;IACH,UAAU,EAAE,IAAI;IAEhB;;;;OAIG;IACH,SAAS,EAAE,IAAI;IAEf;;;;;;;;;OASG;IACH,cAAc,EAAE,sCAA8B;IAE9C;;;;;;;;OAQG;IACH,aAAa,EAAE,2BAAa,CAAC,MAAM;CACpC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,yCAAyC,EACzC,8BAA8B,GAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,6BAA6B,EAC7B,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUCKET_DEPLOYMENT_DEFAULTS = exports.createBucketDeploymentBuilder = exports.BUCKET_ALARM_DEFAULTS = exports.DEFAULT_BUCKET_LIFECYCLE_RULES = exports.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES = exports.BUCKET_DEFAULTS = exports.createBucketBuilder = void 0;
4
+ var bucket_builder_js_1 = require("./bucket-builder.js");
5
+ Object.defineProperty(exports, "createBucketBuilder", { enumerable: true, get: function () { return bucket_builder_js_1.createBucketBuilder; } });
6
+ var defaults_js_1 = require("./defaults.js");
7
+ Object.defineProperty(exports, "BUCKET_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.BUCKET_DEFAULTS; } });
8
+ Object.defineProperty(exports, "DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES", { enumerable: true, get: function () { return defaults_js_1.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES; } });
9
+ Object.defineProperty(exports, "DEFAULT_BUCKET_LIFECYCLE_RULES", { enumerable: true, get: function () { return defaults_js_1.DEFAULT_BUCKET_LIFECYCLE_RULES; } });
10
+ var alarm_defaults_js_1 = require("./alarm-defaults.js");
11
+ Object.defineProperty(exports, "BUCKET_ALARM_DEFAULTS", { enumerable: true, get: function () { return alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS; } });
12
+ var bucket_deployment_builder_js_1 = require("./bucket-deployment-builder.js");
13
+ Object.defineProperty(exports, "createBucketDeploymentBuilder", { enumerable: true, get: function () { return bucket_deployment_builder_js_1.createBucketDeploymentBuilder; } });
14
+ var bucket_deployment_defaults_js_1 = require("./bucket-deployment-defaults.js");
15
+ Object.defineProperty(exports, "BUCKET_DEPLOYMENT_DEFAULTS", { enumerable: true, get: function () { return bucket_deployment_defaults_js_1.BUCKET_DEPLOYMENT_DEFAULTS; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAM6B;AAL3B,wHAAA,mBAAmB,OAAA;AAMrB,6CAIuB;AAHrB,8GAAA,eAAe,OAAA;AACf,wIAAA,yCAAyC,OAAA;AACzC,6HAAA,8BAA8B,OAAA;AAGhC,yDAA4D;AAAnD,0HAAA,qBAAqB,OAAA;AAC9B,+EAIwC;AAHtC,6IAAA,6BAA6B,OAAA;AAK/B,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,48 @@
1
+ import type { AlarmConfig } from "@composurecdk/cloudwatch";
2
+ /**
3
+ * Controls which recommended alarms are created for an S3 bucket.
4
+ * All applicable alarms are enabled by default with AWS-recommended thresholds.
5
+ * Set individual alarms to `false` to disable them, or provide an
6
+ * {@link AlarmConfig} to tune thresholds.
7
+ *
8
+ * S3 request metric alarms (5xxErrors, 4xxErrors) require
9
+ * [CloudWatch request metrics](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-request-metrics-bucket.html)
10
+ * to be enabled on the bucket. Alarms are automatically created for each
11
+ * entry in the bucket's {@link BucketProps.metrics} array, keyed by the
12
+ * metrics configuration ID (e.g. `serverErrors:EntireBucket`).
13
+ *
14
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
15
+ */
16
+ export interface BucketAlarmConfig {
17
+ /**
18
+ * Master switch: set to `false` to disable all recommended alarms.
19
+ * Individual alarms can also be disabled via their own entry.
20
+ * @default true
21
+ */
22
+ enabled?: boolean;
23
+ /**
24
+ * Alarm when S3 returns server-side errors (5xx HTTP status codes).
25
+ *
26
+ * Metric: `AWS/S3 5xxErrors`, statistic Sum, period 5 minutes.
27
+ * Default threshold: > 0 errors.
28
+ *
29
+ * Only created when the bucket has request metrics configured via
30
+ * {@link BucketProps.metrics}. One alarm per metrics configuration.
31
+ *
32
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
33
+ */
34
+ serverErrors?: AlarmConfig | false;
35
+ /**
36
+ * Alarm when S3 returns client-side errors (4xx HTTP status codes).
37
+ *
38
+ * Metric: `AWS/S3 4xxErrors`, statistic Sum, period 5 minutes.
39
+ * Default threshold: > 0 errors.
40
+ *
41
+ * Only created when the bucket has request metrics configured via
42
+ * {@link BucketProps.metrics}. One alarm per metrics configuration.
43
+ *
44
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
45
+ */
46
+ clientErrors?: AlarmConfig | false;
47
+ }
48
+ //# sourceMappingURL=alarm-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-config.d.ts","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEnC;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CACpC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { AlarmConfigDefaults } from "@composurecdk/cloudwatch";
2
+ interface BucketAlarmDefaults {
3
+ enabled: true;
4
+ serverErrors: AlarmConfigDefaults;
5
+ clientErrors: AlarmConfigDefaults;
6
+ }
7
+ /**
8
+ * AWS-recommended default alarm configuration for S3 buckets.
9
+ *
10
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
11
+ */
12
+ export declare const BUCKET_ALARM_DEFAULTS: BucketAlarmDefaults;
13
+ export {};
14
+ //# sourceMappingURL=alarm-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-defaults.d.ts","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,UAAU,mBAAmB;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;IAClC,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAkBnC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAS9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAwB;IACxD,OAAO,EAAE,IAAI;IAEb,iEAAiE;IACjE,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED,yEAAyE;IACzE,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { Bucket, BucketMetrics } from "aws-cdk-lib/aws-s3";
3
+ import type { IConstruct } from "constructs";
4
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
5
+ import type { AlarmDefinition } from "@composurecdk/cloudwatch";
6
+ import type { BucketAlarmConfig } from "./alarm-config.js";
7
+ /**
8
+ * Resolves the recommended alarm configuration into fully-resolved
9
+ * {@link AlarmDefinition}s for an S3 bucket.
10
+ *
11
+ * Creates alarms for each entry in `metricsConfigs`, keyed as
12
+ * `{alarmType}:{filterId}` (e.g. `serverErrors:EntireBucket`).
13
+ */
14
+ export declare function resolveBucketAlarmDefinitions(bucket: Bucket, config: BucketAlarmConfig | undefined, metricsConfigs: BucketMetrics[]): AlarmDefinition[];
15
+ /**
16
+ * Creates AWS-recommended CloudWatch alarms for an S3 bucket,
17
+ * merging recommended definitions with any custom alarm builders.
18
+ *
19
+ * Alarms are created for each entry in `metricsConfigs` (from
20
+ * {@link BucketProps.metrics}). If no metrics configurations are
21
+ * provided, only custom alarms are created.
22
+ *
23
+ * @param scope - CDK construct scope for creating alarm constructs.
24
+ * @param id - Base identifier for alarm construct ids.
25
+ * @param bucket - The S3 bucket to create alarms for.
26
+ * @param config - User-provided alarm configuration, or `false` to disable all.
27
+ * @param metricsConfigs - The bucket's request metrics configurations.
28
+ * @param customAlarms - Custom alarm builders added via `addAlarm()`.
29
+ * @returns A record mapping alarm keys to their created Alarm constructs.
30
+ *
31
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
32
+ */
33
+ export declare function createBucketAlarms(scope: IConstruct, id: string, bucket: Bucket, config: BucketAlarmConfig | false | undefined, metricsConfigs: BucketMetrics[], customAlarms?: AlarmDefinitionBuilder<Bucket>[]): Record<string, Alarm>;
34
+ //# sourceMappingURL=bucket-alarms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-alarms.d.ts","sourceRoot":"","sources":["../../src/bucket-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAqC,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA2B3D;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,cAAc,EAAE,aAAa,EAAE,GAC9B,eAAe,EAAE,CAyCnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GAAG,KAAK,GAAG,SAAS,EAC7C,cAAc,EAAE,aAAa,EAAE,EAC/B,YAAY,GAAE,sBAAsB,CAAC,MAAM,CAAC,EAAO,GAClD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-alarms.js","sourceRoot":"","sources":["../../src/bucket-alarms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import { Bucket, type BucketProps, type IBucket } from "aws-cdk-lib/aws-s3";
3
+ import { type IConstruct } from "constructs";
4
+ import { COPY_STATE, type Lifecycle } from "@composurecdk/core";
5
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
6
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
7
+ import type { BucketAlarmConfig } from "./alarm-config.js";
8
+ /**
9
+ * Configures how server access logs are handled. Pass `false` to disable
10
+ * logging; pass an object to wire a destination, prefix, or customize the
11
+ * auto-created sub-builder.
12
+ *
13
+ * `configure` cannot be combined with `destination` — a user-managed
14
+ * destination is not built by this builder.
15
+ */
16
+ export type ServerAccessLogsConfig = false | {
17
+ destination?: IBucket;
18
+ prefix?: string;
19
+ /**
20
+ * Customize the auto-created logging sub-builder. Receives a builder
21
+ * pre-seeded with `versioned: false`, `removalPolicy: RETAIN`, and
22
+ * recursive access logging disabled.
23
+ */
24
+ configure?: (b: IBucketBuilder) => IBucketBuilder;
25
+ };
26
+ /**
27
+ * Configuration properties for the S3 bucket builder. Extends CDK
28
+ * {@link BucketProps} with builder-specific options.
29
+ */
30
+ export interface BucketBuilderProps extends Omit<BucketProps, "serverAccessLogsBucket" | "serverAccessLogsPrefix"> {
31
+ /** See {@link ServerAccessLogsConfig}. Defaults to `{ prefix: "logs/" }`. */
32
+ serverAccessLogs?: ServerAccessLogsConfig;
33
+ /**
34
+ * Configuration for AWS-recommended CloudWatch alarms.
35
+ *
36
+ * S3 request metric alarms (5xxErrors, 4xxErrors) require
37
+ * [CloudWatch request metrics](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-request-metrics-bucket.html)
38
+ * to be enabled on the bucket. Set {@link BucketAlarmConfig.requestMetricsFilterId}
39
+ * to the ID of the request metrics configuration to create these alarms.
40
+ *
41
+ * No alarm actions are configured by default since notification
42
+ * methods are user-specific. Access alarms from the build result
43
+ * or use an `afterBuild` hook to apply actions.
44
+ *
45
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
46
+ */
47
+ recommendedAlarms?: BucketAlarmConfig | false;
48
+ }
49
+ /**
50
+ * The build output of a {@link IBucketBuilder}. Contains the CDK constructs
51
+ * created during {@link Lifecycle.build}, keyed by role.
52
+ */
53
+ export interface BucketBuilderResult {
54
+ /** The S3 bucket construct created by the builder. */
55
+ bucket: Bucket;
56
+ /**
57
+ * The S3 bucket created for access logging, or `undefined` if access
58
+ * logging was disabled or the user provided their own destination.
59
+ */
60
+ accessLogsBucket?: Bucket;
61
+ /**
62
+ * CloudWatch alarms created for the bucket, keyed by alarm name.
63
+ *
64
+ * Includes both AWS-recommended alarms and any custom alarms added
65
+ * via {@link IBucketBuilder.addAlarm}. Access individual alarms
66
+ * by key (e.g., `result.alarms.serverErrors`).
67
+ *
68
+ * No alarm actions are configured — apply them via the result or an
69
+ * `afterBuild` hook.
70
+ *
71
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
72
+ */
73
+ alarms: Record<string, Alarm>;
74
+ }
75
+ /**
76
+ * A fluent builder for configuring and creating an Amazon S3 bucket.
77
+ *
78
+ * Each configuration property from the CDK {@link BucketProps} is exposed
79
+ * as an overloaded method: call with a value to set it (returns the builder
80
+ * for chaining), or call with no arguments to read the current value.
81
+ *
82
+ * The builder implements {@link Lifecycle}, so it can be used directly as a
83
+ * component in a {@link compose | composed system}. When built, it creates
84
+ * an S3 bucket with the configured properties and returns a
85
+ * {@link BucketBuilderResult}.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * const site = createBucketBuilder()
90
+ * .bucketName("my-website-bucket")
91
+ * .versioned(false);
92
+ * ```
93
+ */
94
+ export type IBucketBuilder = ITaggedBuilder<BucketBuilderProps, BucketBuilder>;
95
+ declare class BucketBuilder implements Lifecycle<BucketBuilderResult> {
96
+ #private;
97
+ props: Partial<BucketBuilderProps>;
98
+ addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<Bucket>) => AlarmDefinitionBuilder<Bucket>): this;
99
+ /** @internal — see ADR-0005. */
100
+ [COPY_STATE](target: BucketBuilder): void;
101
+ build(scope: IConstruct, id: string): BucketBuilderResult;
102
+ }
103
+ /**
104
+ * Creates a new {@link IBucketBuilder} for configuring an Amazon S3 bucket.
105
+ *
106
+ * This is the entry point for defining an S3 bucket component. The returned
107
+ * builder exposes every {@link BucketProps} property as a fluent setter/getter
108
+ * and implements {@link Lifecycle} for use with {@link compose}.
109
+ *
110
+ * @returns A fluent builder for an Amazon S3 bucket.
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * const site = createBucketBuilder()
115
+ * .bucketName("my-site")
116
+ * .versioned(false);
117
+ *
118
+ * // Use standalone:
119
+ * const result = site.build(stack, "SiteBucket");
120
+ *
121
+ * // Or compose into a system:
122
+ * const system = compose(
123
+ * { site, cdn: createDistributionBuilder() },
124
+ * { site: [], cdn: ["site"] },
125
+ * );
126
+ * ```
127
+ */
128
+ export declare function createBucketBuilder(): IBucketBuilder;
129
+ export {};
130
+ //# sourceMappingURL=bucket-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-builder.d.ts","sourceRoot":"","sources":["../../src/bucket-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAC9B,KAAK,GACL;IACE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,cAAc,CAAC;CACnD,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAC9C,WAAW,EACX,wBAAwB,GAAG,wBAAwB,CACpD;IACC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAE1C;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAC;CAC/C;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;AAE/E,cAAM,aAAc,YAAW,SAAS,CAAC,mBAAmB,CAAC;;IAC3D,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAM;IAGxC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,MAAM,CAAC,GACnF,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIzC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,mBAAmB;CA+B1D;AAgED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD"}
@@ -1,6 +1,7 @@
1
1
  import { RemovalPolicy } from "aws-cdk-lib";
2
2
  import { Bucket } from "aws-cdk-lib/aws-s3";
3
- import { Builder } from "@composurecdk/core";
3
+ import { COPY_STATE } from "@composurecdk/core";
4
+ import { taggedBuilder } from "@composurecdk/cloudformation";
4
5
  import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
5
6
  import { createBucketAlarms } from "./bucket-alarms.js";
6
7
  import { DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES, BUCKET_DEFAULTS } from "./defaults.js";
@@ -11,6 +12,10 @@ class BucketBuilder {
11
12
  this.#customAlarms.push(configure(new AlarmDefinitionBuilder(key)));
12
13
  return this;
13
14
  }
15
+ /** @internal — see ADR-0005. */
16
+ [COPY_STATE](target) {
17
+ target.#customAlarms.push(...this.#customAlarms);
18
+ }
14
19
  build(scope, id) {
15
20
  const { serverAccessLogs, recommendedAlarms: alarmConfig, ...bucketProps } = this.props;
16
21
  const { serverAccessLogs: defaultServerAccessLogs, ...cdkDefaults } = BUCKET_DEFAULTS;
@@ -105,6 +110,6 @@ function autoDeleteProps(userProps, defaults) {
105
110
  * ```
106
111
  */
107
112
  export function createBucketBuilder() {
108
- return Builder(BucketBuilder);
113
+ return taggedBuilder(BucketBuilder);
109
114
  }
110
115
  //# sourceMappingURL=bucket-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-builder.js","sourceRoot":"","sources":["../../src/bucket-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
2
+ import { type IBucket } from "aws-cdk-lib/aws-s3";
3
+ import { type IDistribution } from "aws-cdk-lib/aws-cloudfront";
4
+ import type { LogGroup } from "aws-cdk-lib/aws-logs";
5
+ import { type IConstruct } from "constructs";
6
+ import { COPY_STATE, type Lifecycle, type Resolvable } from "@composurecdk/core";
7
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
8
+ import { type BucketDeploymentBuilderProps } from "./bucket-deployment-props.js";
9
+ /**
10
+ * The build output of a {@link IBucketDeploymentBuilder}.
11
+ */
12
+ export interface BucketDeploymentBuilderResult {
13
+ /** The CDK BucketDeployment construct created by the builder. */
14
+ deployment: BucketDeployment;
15
+ /**
16
+ * The CloudWatch LogGroup created for the deployment's backing Lambda,
17
+ * or `undefined` if the user provided their own via the `logGroup`
18
+ * property.
19
+ *
20
+ * By default the builder creates a managed LogGroup using
21
+ * {@link createLogGroupBuilder} with well-architected defaults (retention
22
+ * policy, removal policy). This prevents the backing Lambda from
23
+ * creating an auto-managed log group with infinite retention.
24
+ *
25
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment.BucketDeploymentProps.html#loggroup
26
+ */
27
+ logGroup?: LogGroup;
28
+ }
29
+ /**
30
+ * A fluent builder for configuring and creating an S3 BucketDeployment.
31
+ *
32
+ * Each configuration property from the CDK {@link BucketDeploymentProps} is
33
+ * exposed as an overloaded method: call with a value to set it (returns the
34
+ * builder for chaining), or call with no arguments to read the current value.
35
+ *
36
+ * The `destinationBucket` and `distribution` are set via dedicated methods
37
+ * that accept {@link Resolvable} values for cross-component wiring.
38
+ *
39
+ * The builder implements {@link Lifecycle}, so it can be used directly as a
40
+ * component in a {@link compose | composed system}.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const deploy = createBucketDeploymentBuilder()
45
+ * .sources([Source.asset("./site")])
46
+ * .destinationBucket(ref("site", (r: BucketBuilderResult) => r.bucket))
47
+ * .distribution(ref("cdn", (r: DistributionBuilderResult) => r.distribution))
48
+ * .distributionPaths(["/*"]);
49
+ * ```
50
+ */
51
+ export type IBucketDeploymentBuilder = ITaggedBuilder<BucketDeploymentBuilderProps, BucketDeploymentBuilder>;
52
+ declare class BucketDeploymentBuilder implements Lifecycle<BucketDeploymentBuilderResult> {
53
+ #private;
54
+ props: Partial<BucketDeploymentBuilderProps>;
55
+ /**
56
+ * Sets the destination bucket for the deployment.
57
+ *
58
+ * Accepts a concrete {@link IBucket} or a {@link Ref} that resolves to one
59
+ * at build time.
60
+ *
61
+ * @param bucket - The bucket or a Ref to one.
62
+ * @returns This builder for chaining.
63
+ */
64
+ destinationBucket(bucket: Resolvable<IBucket>): this;
65
+ /**
66
+ * Sets the CloudFront distribution to invalidate on deployment.
67
+ *
68
+ * Accepts a concrete {@link IDistribution} or a {@link Ref} that resolves
69
+ * to one at build time. This is optional — deployments can target a bucket
70
+ * without CloudFront invalidation.
71
+ *
72
+ * @param distribution - The distribution or a Ref to one.
73
+ * @returns This builder for chaining.
74
+ */
75
+ distribution(distribution: Resolvable<IDistribution>): this;
76
+ /** @internal — see ADR-0005. */
77
+ [COPY_STATE](target: BucketDeploymentBuilder): void;
78
+ build(scope: IConstruct, id: string, context?: Record<string, object>): BucketDeploymentBuilderResult;
79
+ }
80
+ /**
81
+ * Creates a new {@link IBucketDeploymentBuilder} for deploying content to an
82
+ * S3 bucket with optional CloudFront cache invalidation.
83
+ *
84
+ * This is the entry point for defining an S3 deployment component. The
85
+ * returned builder exposes {@link BucketDeploymentBuilderProps} properties as
86
+ * fluent setters/getters, plus {@link IBucketDeploymentBuilder.destinationBucket | destinationBucket()}
87
+ * and {@link IBucketDeploymentBuilder.distribution | distribution()} for
88
+ * cross-component wiring with Ref support. It implements {@link Lifecycle}
89
+ * for use with {@link compose}.
90
+ *
91
+ * @returns A fluent builder for an S3 BucketDeployment.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * const deploy = createBucketDeploymentBuilder()
96
+ * .sources([Source.asset("./site")])
97
+ * .destinationBucket(ref("site", (r: BucketBuilderResult) => r.bucket))
98
+ * .distribution(ref("cdn", (r: DistributionBuilderResult) => r.distribution))
99
+ * .distributionPaths(["/*"]);
100
+ *
101
+ * // Use standalone:
102
+ * const result = deploy.build(stack, "Deploy");
103
+ *
104
+ * // Or compose into a system:
105
+ * const system = compose(
106
+ * { site: createBucketBuilder(), cdn: createDistributionBuilder(), deploy },
107
+ * { site: [], cdn: ["site"], deploy: ["site", "cdn"] },
108
+ * );
109
+ * ```
110
+ */
111
+ export declare function createBucketDeploymentBuilder(): IBucketDeploymentBuilder;
112
+ export {};
113
+ //# sourceMappingURL=bucket-deployment-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-deployment-builder.d.ts","sourceRoot":"","sources":["../../src/bucket-deployment-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA8B,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAGlF,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,iEAAiE;IACjE,UAAU,EAAE,gBAAgB,CAAC;IAE7B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,wBAAwB,GAAG,cAAc,CACnD,4BAA4B,EAC5B,uBAAuB,CACxB,CAAC;AAEF,cAAM,uBAAwB,YAAW,SAAS,CAAC,6BAA6B,CAAC;;IAC/E,KAAK,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAM;IAIlD;;;;;;;;OAQG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAKpD;;;;;;;;;OASG;IACH,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,IAAI;IAK3D,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAKnD,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,6BAA6B;CAiDjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,6BAA6B,IAAI,wBAAwB,CAIxE"}
@@ -1,5 +1,6 @@
1
1
  import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
2
- import { Builder, resolve, } from "@composurecdk/core";
2
+ import { COPY_STATE, resolve } from "@composurecdk/core";
3
+ import { taggedBuilder } from "@composurecdk/cloudformation";
3
4
  import { createLogGroupBuilder } from "@composurecdk/logs";
4
5
  import { effectiveDefaults } from "./bucket-deployment-defaults.js";
5
6
  class BucketDeploymentBuilder {
@@ -33,6 +34,11 @@ class BucketDeploymentBuilder {
33
34
  this.#distribution = distribution;
34
35
  return this;
35
36
  }
37
+ /** @internal — see ADR-0005. */
38
+ [COPY_STATE](target) {
39
+ target.#destinationBucket = this.#destinationBucket;
40
+ target.#distribution = this.#distribution;
41
+ }
36
42
  build(scope, id, context) {
37
43
  const ctx = context ?? {};
38
44
  const resolvedBucket = this.#destinationBucket
@@ -102,6 +108,6 @@ class BucketDeploymentBuilder {
102
108
  * ```
103
109
  */
104
110
  export function createBucketDeploymentBuilder() {
105
- return Builder(BucketDeploymentBuilder);
111
+ return taggedBuilder(BucketDeploymentBuilder);
106
112
  }
107
113
  //# sourceMappingURL=bucket-deployment-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-deployment-builder.js","sourceRoot":"","sources":["../../src/bucket-deployment-builder.ts"],"names":[],"mappings":"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"}