@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 @@
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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=alarm-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../src/alarm-config.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
@@ -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,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUCKET_ALARM_DEFAULTS = void 0;
4
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
5
+ /**
6
+ * AWS-recommended default alarm configuration for S3 buckets.
7
+ *
8
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
9
+ */
10
+ exports.BUCKET_ALARM_DEFAULTS = {
11
+ enabled: true,
12
+ /** Any server-side error is worth investigating; threshold 0. */
13
+ serverErrors: {
14
+ threshold: 0,
15
+ evaluationPeriods: 1,
16
+ datapointsToAlarm: 1,
17
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
18
+ },
19
+ /** Any client-side error pattern is worth investigating; threshold 0. */
20
+ clientErrors: {
21
+ threshold: 0,
22
+ evaluationPeriods: 1,
23
+ datapointsToAlarm: 1,
24
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
25
+ },
26
+ };
27
+ //# sourceMappingURL=alarm-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm-defaults.js","sourceRoot":"","sources":["../../src/alarm-defaults.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAS9D;;;;GAIG;AACU,QAAA,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,iCAAgB,CAAC,aAAa;KACjD;IAED,yEAAyE;IACzE,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -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,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBucketAlarmDefinitions = resolveBucketAlarmDefinitions;
4
+ exports.createBucketAlarms = createBucketAlarms;
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
7
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
8
+ const alarm_defaults_js_1 = require("./alarm-defaults.js");
9
+ const METRIC_PERIOD = aws_cdk_lib_1.Duration.minutes(5);
10
+ const METRIC_PERIOD_LABEL = `${String(METRIC_PERIOD.toMinutes())} minutes`;
11
+ /**
12
+ * Creates an S3 request metric with the correct namespace and dimensions.
13
+ */
14
+ function s3RequestMetric(bucket, filterId, metricName, statistic) {
15
+ return new aws_cloudwatch_1.Metric({
16
+ namespace: "AWS/S3",
17
+ metricName,
18
+ dimensionsMap: {
19
+ BucketName: bucket.bucketName,
20
+ FilterId: filterId,
21
+ },
22
+ statistic,
23
+ period: METRIC_PERIOD,
24
+ });
25
+ }
26
+ /**
27
+ * Resolves the recommended alarm configuration into fully-resolved
28
+ * {@link AlarmDefinition}s for an S3 bucket.
29
+ *
30
+ * Creates alarms for each entry in `metricsConfigs`, keyed as
31
+ * `{alarmType}:{filterId}` (e.g. `serverErrors:EntireBucket`).
32
+ */
33
+ function resolveBucketAlarmDefinitions(bucket, config, metricsConfigs) {
34
+ if (config?.enabled === false)
35
+ return [];
36
+ if (metricsConfigs.length === 0)
37
+ return [];
38
+ const definitions = [];
39
+ for (const metrics of metricsConfigs) {
40
+ const filterId = metrics.id;
41
+ if (config?.serverErrors !== false) {
42
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.serverErrors, alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS.serverErrors);
43
+ definitions.push({
44
+ key: `serverErrors:${filterId}`,
45
+ alarmName: cfg.alarmName,
46
+ metric: s3RequestMetric(bucket, filterId, "5xxErrors", aws_cloudwatch_1.Stats.SUM),
47
+ threshold: cfg.threshold,
48
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
49
+ evaluationPeriods: cfg.evaluationPeriods,
50
+ datapointsToAlarm: cfg.datapointsToAlarm,
51
+ treatMissingData: cfg.treatMissingData,
52
+ description: `S3 bucket is returning server-side errors (filter: ${filterId}). Threshold: > ${String(cfg.threshold)} 5xx errors in ${METRIC_PERIOD_LABEL}.`,
53
+ });
54
+ }
55
+ if (config?.clientErrors !== false) {
56
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.clientErrors, alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS.clientErrors);
57
+ definitions.push({
58
+ key: `clientErrors:${filterId}`,
59
+ alarmName: cfg.alarmName,
60
+ metric: s3RequestMetric(bucket, filterId, "4xxErrors", aws_cloudwatch_1.Stats.SUM),
61
+ threshold: cfg.threshold,
62
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
63
+ evaluationPeriods: cfg.evaluationPeriods,
64
+ datapointsToAlarm: cfg.datapointsToAlarm,
65
+ treatMissingData: cfg.treatMissingData,
66
+ description: `S3 bucket is returning client-side errors (filter: ${filterId}). Threshold: > ${String(cfg.threshold)} 4xx errors in ${METRIC_PERIOD_LABEL}.`,
67
+ });
68
+ }
69
+ }
70
+ return definitions;
71
+ }
72
+ /**
73
+ * Creates AWS-recommended CloudWatch alarms for an S3 bucket,
74
+ * merging recommended definitions with any custom alarm builders.
75
+ *
76
+ * Alarms are created for each entry in `metricsConfigs` (from
77
+ * {@link BucketProps.metrics}). If no metrics configurations are
78
+ * provided, only custom alarms are created.
79
+ *
80
+ * @param scope - CDK construct scope for creating alarm constructs.
81
+ * @param id - Base identifier for alarm construct ids.
82
+ * @param bucket - The S3 bucket to create alarms for.
83
+ * @param config - User-provided alarm configuration, or `false` to disable all.
84
+ * @param metricsConfigs - The bucket's request metrics configurations.
85
+ * @param customAlarms - Custom alarm builders added via `addAlarm()`.
86
+ * @returns A record mapping alarm keys to their created Alarm constructs.
87
+ *
88
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#S3
89
+ */
90
+ function createBucketAlarms(scope, id, bucket, config, metricsConfigs, customAlarms = []) {
91
+ if (config === false)
92
+ return {};
93
+ const enabled = config?.enabled ?? alarm_defaults_js_1.BUCKET_ALARM_DEFAULTS.enabled;
94
+ if (!enabled)
95
+ return {};
96
+ const recommended = resolveBucketAlarmDefinitions(bucket, config, metricsConfigs);
97
+ const custom = customAlarms.map((b) => b.resolve(bucket));
98
+ return (0, cloudwatch_1.createAlarms)(scope, id, [...recommended, ...custom]);
99
+ }
100
+ //# sourceMappingURL=bucket-alarms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-alarms.js","sourceRoot":"","sources":["../../src/bucket-alarms.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
2
  import { Bucket, type BucketProps, type IBucket } from "aws-cdk-lib/aws-s3";
3
3
  import { type IConstruct } from "constructs";
4
- import { type IBuilder, type Lifecycle } from "@composurecdk/core";
4
+ import { COPY_STATE, type Lifecycle } from "@composurecdk/core";
5
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
5
6
  import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
6
7
  import type { BucketAlarmConfig } from "./alarm-config.js";
7
8
  /**
@@ -90,11 +91,13 @@ export interface BucketBuilderResult {
90
91
  * .versioned(false);
91
92
  * ```
92
93
  */
93
- export type IBucketBuilder = IBuilder<BucketBuilderProps, BucketBuilder>;
94
+ export type IBucketBuilder = ITaggedBuilder<BucketBuilderProps, BucketBuilder>;
94
95
  declare class BucketBuilder implements Lifecycle<BucketBuilderResult> {
95
96
  #private;
96
97
  props: Partial<BucketBuilderProps>;
97
98
  addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<Bucket>) => AlarmDefinitionBuilder<Bucket>): this;
99
+ /** @internal — see ADR-0005. */
100
+ [COPY_STATE](target: BucketBuilder): void;
98
101
  build(scope: IConstruct, id: string): BucketBuilderResult;
99
102
  }
100
103
  /**
@@ -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"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBucketBuilder = createBucketBuilder;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
6
+ const core_1 = require("@composurecdk/core");
7
+ const cloudformation_1 = require("@composurecdk/cloudformation");
8
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
9
+ const bucket_alarms_js_1 = require("./bucket-alarms.js");
10
+ const defaults_js_1 = require("./defaults.js");
11
+ class BucketBuilder {
12
+ props = {};
13
+ #customAlarms = [];
14
+ addAlarm(key, configure) {
15
+ this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
16
+ return this;
17
+ }
18
+ /** @internal — see ADR-0005. */
19
+ [core_1.COPY_STATE](target) {
20
+ target.#customAlarms.push(...this.#customAlarms);
21
+ }
22
+ build(scope, id) {
23
+ const { serverAccessLogs, recommendedAlarms: alarmConfig, ...bucketProps } = this.props;
24
+ const { serverAccessLogs: defaultServerAccessLogs, ...cdkDefaults } = defaults_js_1.BUCKET_DEFAULTS;
25
+ const cfg = serverAccessLogs ?? defaultServerAccessLogs;
26
+ const { accessLogsBucket, accessLogProps } = resolveAccessLogs(scope, id, cfg);
27
+ const mergedProps = {
28
+ ...cdkDefaults,
29
+ ...accessLogProps,
30
+ ...bucketProps,
31
+ ...autoDeleteProps(bucketProps, defaults_js_1.BUCKET_DEFAULTS),
32
+ };
33
+ const bucket = new aws_s3_1.Bucket(scope, id, mergedProps);
34
+ const alarms = (0, bucket_alarms_js_1.createBucketAlarms)(scope, id, bucket, alarmConfig, bucketProps.metrics ?? [], this.#customAlarms);
35
+ return {
36
+ bucket,
37
+ accessLogsBucket,
38
+ alarms,
39
+ };
40
+ }
41
+ }
42
+ function resolveAccessLogs(scope, id, cfg) {
43
+ if (cfg === false || cfg === undefined) {
44
+ return { accessLogProps: {} };
45
+ }
46
+ if (cfg.destination !== undefined) {
47
+ if (cfg.configure !== undefined) {
48
+ throw new Error("serverAccessLogs: 'configure' cannot be combined with 'destination' — " +
49
+ "the destination bucket is user-managed and not built by this builder.");
50
+ }
51
+ return {
52
+ accessLogProps: {
53
+ serverAccessLogsBucket: cfg.destination,
54
+ ...(cfg.prefix !== undefined ? { serverAccessLogsPrefix: cfg.prefix } : {}),
55
+ },
56
+ };
57
+ }
58
+ let subBuilder = createBucketBuilder()
59
+ .serverAccessLogs(false)
60
+ .versioned(false)
61
+ .removalPolicy(aws_cdk_lib_1.RemovalPolicy.RETAIN)
62
+ .lifecycleRules(defaults_js_1.DEFAULT_ACCESS_LOG_BUCKET_LIFECYCLE_RULES);
63
+ if (cfg.configure) {
64
+ subBuilder = cfg.configure(subBuilder);
65
+ }
66
+ const accessLogsBucket = subBuilder.build(scope, `${id}AccessLogs`).bucket;
67
+ return {
68
+ accessLogsBucket,
69
+ accessLogProps: {
70
+ serverAccessLogsBucket: accessLogsBucket,
71
+ ...(cfg.prefix !== undefined ? { serverAccessLogsPrefix: cfg.prefix } : {}),
72
+ },
73
+ };
74
+ }
75
+ /**
76
+ * Returns `{ autoDeleteObjects: true }` when the effective removal policy is
77
+ * `DESTROY` and the user has not explicitly set `autoDeleteObjects`.
78
+ *
79
+ * CDK requires `autoDeleteObjects` to be paired with `removalPolicy: DESTROY`,
80
+ * but forgetting it causes a non-empty-bucket error on stack deletion. This
81
+ * helper bridges that gap so that switching to `DESTROY` Just Works.
82
+ */
83
+ function autoDeleteProps(userProps, defaults) {
84
+ const effectivePolicy = userProps.removalPolicy ?? defaults.removalPolicy;
85
+ if (effectivePolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY && userProps.autoDeleteObjects === undefined) {
86
+ return { autoDeleteObjects: true };
87
+ }
88
+ return {};
89
+ }
90
+ /**
91
+ * Creates a new {@link IBucketBuilder} for configuring an Amazon S3 bucket.
92
+ *
93
+ * This is the entry point for defining an S3 bucket component. The returned
94
+ * builder exposes every {@link BucketProps} property as a fluent setter/getter
95
+ * and implements {@link Lifecycle} for use with {@link compose}.
96
+ *
97
+ * @returns A fluent builder for an Amazon S3 bucket.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * const site = createBucketBuilder()
102
+ * .bucketName("my-site")
103
+ * .versioned(false);
104
+ *
105
+ * // Use standalone:
106
+ * const result = site.build(stack, "SiteBucket");
107
+ *
108
+ * // Or compose into a system:
109
+ * const system = compose(
110
+ * { site, cdn: createDistributionBuilder() },
111
+ * { site: [], cdn: ["site"] },
112
+ * );
113
+ * ```
114
+ */
115
+ function createBucketBuilder() {
116
+ return (0, cloudformation_1.taggedBuilder)(BucketBuilder);
117
+ }
118
+ //# 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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"}
@@ -3,7 +3,8 @@ import { type IBucket } from "aws-cdk-lib/aws-s3";
3
3
  import { type IDistribution } from "aws-cdk-lib/aws-cloudfront";
4
4
  import type { LogGroup } from "aws-cdk-lib/aws-logs";
5
5
  import { type IConstruct } from "constructs";
6
- import { type IBuilder, type Lifecycle, type Resolvable } from "@composurecdk/core";
6
+ import { COPY_STATE, type Lifecycle, type Resolvable } from "@composurecdk/core";
7
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
7
8
  import { type BucketDeploymentBuilderProps } from "./bucket-deployment-props.js";
8
9
  /**
9
10
  * The build output of a {@link IBucketDeploymentBuilder}.
@@ -47,7 +48,7 @@ export interface BucketDeploymentBuilderResult {
47
48
  * .distributionPaths(["/*"]);
48
49
  * ```
49
50
  */
50
- export type IBucketDeploymentBuilder = IBuilder<BucketDeploymentBuilderProps, BucketDeploymentBuilder>;
51
+ export type IBucketDeploymentBuilder = ITaggedBuilder<BucketDeploymentBuilderProps, BucketDeploymentBuilder>;
51
52
  declare class BucketDeploymentBuilder implements Lifecycle<BucketDeploymentBuilderResult> {
52
53
  #private;
53
54
  props: Partial<BucketDeploymentBuilderProps>;
@@ -72,6 +73,8 @@ declare class BucketDeploymentBuilder implements Lifecycle<BucketDeploymentBuild
72
73
  * @returns This builder for chaining.
73
74
  */
74
75
  distribution(distribution: Resolvable<IDistribution>): this;
76
+ /** @internal — see ADR-0005. */
77
+ [COPY_STATE](target: BucketDeploymentBuilder): void;
75
78
  build(scope: IConstruct, id: string, context?: Record<string, object>): BucketDeploymentBuilderResult;
76
79
  }
77
80
  /**
@@ -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"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBucketDeploymentBuilder = createBucketDeploymentBuilder;
4
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
5
+ const core_1 = require("@composurecdk/core");
6
+ const cloudformation_1 = require("@composurecdk/cloudformation");
7
+ const logs_1 = require("@composurecdk/logs");
8
+ const bucket_deployment_defaults_js_1 = require("./bucket-deployment-defaults.js");
9
+ class BucketDeploymentBuilder {
10
+ props = {};
11
+ #destinationBucket;
12
+ #distribution;
13
+ /**
14
+ * Sets the destination bucket for the deployment.
15
+ *
16
+ * Accepts a concrete {@link IBucket} or a {@link Ref} that resolves to one
17
+ * at build time.
18
+ *
19
+ * @param bucket - The bucket or a Ref to one.
20
+ * @returns This builder for chaining.
21
+ */
22
+ destinationBucket(bucket) {
23
+ this.#destinationBucket = bucket;
24
+ return this;
25
+ }
26
+ /**
27
+ * Sets the CloudFront distribution to invalidate on deployment.
28
+ *
29
+ * Accepts a concrete {@link IDistribution} or a {@link Ref} that resolves
30
+ * to one at build time. This is optional — deployments can target a bucket
31
+ * without CloudFront invalidation.
32
+ *
33
+ * @param distribution - The distribution or a Ref to one.
34
+ * @returns This builder for chaining.
35
+ */
36
+ distribution(distribution) {
37
+ this.#distribution = distribution;
38
+ return this;
39
+ }
40
+ /** @internal — see ADR-0005. */
41
+ [core_1.COPY_STATE](target) {
42
+ target.#destinationBucket = this.#destinationBucket;
43
+ target.#distribution = this.#distribution;
44
+ }
45
+ build(scope, id, context) {
46
+ const ctx = context ?? {};
47
+ const resolvedBucket = this.#destinationBucket
48
+ ? (0, core_1.resolve)(this.#destinationBucket, ctx)
49
+ : undefined;
50
+ if (!resolvedBucket) {
51
+ throw new Error(`BucketDeploymentBuilder "${id}" requires a destination bucket. ` +
52
+ `Call .destinationBucket() with an IBucket or a Ref to one.`);
53
+ }
54
+ const { sources, ...deployProps } = this.props;
55
+ if (!sources || sources.length === 0) {
56
+ throw new Error(`BucketDeploymentBuilder "${id}" requires at least one source. ` +
57
+ `Call .sources() with an array of ISource.`);
58
+ }
59
+ const resolvedDistribution = this.#distribution ? (0, core_1.resolve)(this.#distribution, ctx) : undefined;
60
+ // Auto-create a managed LogGroup for the deployment's backing Lambda
61
+ // unless the user supplied their own, matching the Lambda builder pattern.
62
+ let logGroup;
63
+ let logGroupProps = {};
64
+ if (!deployProps.logGroup) {
65
+ logGroup = (0, logs_1.createLogGroupBuilder)().build(scope, `${id}LogGroup`).logGroup;
66
+ logGroupProps = { logGroup };
67
+ }
68
+ const mergedProps = {
69
+ ...(0, bucket_deployment_defaults_js_1.effectiveDefaults)(!!resolvedDistribution),
70
+ ...logGroupProps,
71
+ ...deployProps,
72
+ ...(resolvedDistribution ? { distribution: resolvedDistribution } : {}),
73
+ sources,
74
+ destinationBucket: resolvedBucket,
75
+ };
76
+ return {
77
+ deployment: new aws_s3_deployment_1.BucketDeployment(scope, id, mergedProps),
78
+ logGroup,
79
+ };
80
+ }
81
+ }
82
+ /**
83
+ * Creates a new {@link IBucketDeploymentBuilder} for deploying content to an
84
+ * S3 bucket with optional CloudFront cache invalidation.
85
+ *
86
+ * This is the entry point for defining an S3 deployment component. The
87
+ * returned builder exposes {@link BucketDeploymentBuilderProps} properties as
88
+ * fluent setters/getters, plus {@link IBucketDeploymentBuilder.destinationBucket | destinationBucket()}
89
+ * and {@link IBucketDeploymentBuilder.distribution | distribution()} for
90
+ * cross-component wiring with Ref support. It implements {@link Lifecycle}
91
+ * for use with {@link compose}.
92
+ *
93
+ * @returns A fluent builder for an S3 BucketDeployment.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * const deploy = createBucketDeploymentBuilder()
98
+ * .sources([Source.asset("./site")])
99
+ * .destinationBucket(ref("site", (r: BucketBuilderResult) => r.bucket))
100
+ * .distribution(ref("cdn", (r: DistributionBuilderResult) => r.distribution))
101
+ * .distributionPaths(["/*"]);
102
+ *
103
+ * // Use standalone:
104
+ * const result = deploy.build(stack, "Deploy");
105
+ *
106
+ * // Or compose into a system:
107
+ * const system = compose(
108
+ * { site: createBucketBuilder(), cdn: createDistributionBuilder(), deploy },
109
+ * { site: [], cdn: ["site"], deploy: ["site", "cdn"] },
110
+ * );
111
+ * ```
112
+ */
113
+ function createBucketDeploymentBuilder() {
114
+ return (0, cloudformation_1.taggedBuilder)(BucketDeploymentBuilder);
115
+ }
116
+ //# 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":";;AA0LA,sEAIC;AA9LD,qEAA6F;AAK7F,6CAA0F;AAC1F,iEAAkF;AAClF,6CAA2D;AAC3D,mFAAoE;AAoDpE,MAAM,uBAAuB;IAC3B,KAAK,GAA0C,EAAE,CAAC;IAClD,kBAAkB,CAAuB;IACzC,aAAa,CAA6B;IAE1C;;;;;;;;OAQG;IACH,iBAAiB,CAAC,MAA2B;QAC3C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,YAAY,CAAC,YAAuC;QAClD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAA+B;QAC1C,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACpD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,KAAK,CACH,KAAiB,EACjB,EAAU,EACV,OAAgC;QAEhC,MAAM,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB;YAC5C,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,4BAA4B,EAAE,mCAAmC;gBAC/D,4DAA4D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE/C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,4BAA4B,EAAE,kCAAkC;gBAC9D,2CAA2C,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/F,qEAAqE;QACrE,2EAA2E;QAC3E,IAAI,QAA8B,CAAC;QACnC,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,QAAQ,GAAG,IAAA,4BAAqB,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC;YAC1E,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG;YAClB,GAAG,IAAA,iDAAiB,EAAC,CAAC,CAAC,oBAAoB,CAAC;YAC5C,GAAG,aAAa;YAChB,GAAG,WAAW;YACd,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO;YACP,iBAAiB,EAAE,cAAc;SACT,CAAC;QAE3B,OAAO;YACL,UAAU,EAAE,IAAI,oCAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC;YACxD,QAAQ;SACT,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,SAAgB,6BAA6B;IAC3C,OAAO,IAAA,8BAAa,EAClB,uBAAuB,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-deployment-defaults.d.ts","sourceRoot":"","sources":["../../src/bucket-deployment-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAmDjF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGtC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAEjG"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUCKET_DEPLOYMENT_DEFAULTS = void 0;
4
+ exports.effectiveDefaults = effectiveDefaults;
5
+ /**
6
+ * Defaults that apply regardless of whether a CloudFront distribution is
7
+ * present. Split from distribution-specific defaults so the builder can
8
+ * merge without runtime filtering.
9
+ */
10
+ const BASE_DEFAULTS = {
11
+ /**
12
+ * Remove files from the destination bucket that are not present in the
13
+ * source, keeping the bucket in sync with the deployed assets and
14
+ * preventing stale content from being served.
15
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/operational-excellence-pillar/ops_evolve_ops_learned_from_experience.html
16
+ */
17
+ prune: true,
18
+ /**
19
+ * Allocate 256 MiB to the deployment Lambda. The CDK default of 128 MiB
20
+ * is insufficient for deployments with more than a handful of files and
21
+ * can cause silent failures or timeouts.
22
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_withstand_component_failures_avoid_hard_coded_limits.html
23
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment-readme.html#memory-limit
24
+ */
25
+ memoryLimit: 256,
26
+ /**
27
+ * Do not retain deployed files when the stack is deleted. This aligns
28
+ * with `prune: true` semantics — the deployment keeps the bucket in
29
+ * sync with the source, so retaining stale files on deletion is
30
+ * inconsistent. The destination bucket's own removal policy governs
31
+ * whether the bucket itself is retained.
32
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_deployment.BucketDeploymentProps.html#retainondelete
33
+ */
34
+ retainOnDelete: false,
35
+ };
36
+ /**
37
+ * Defaults that only apply when a CloudFront distribution is configured.
38
+ * CDK throws if `distributionPaths` is set without a distribution.
39
+ */
40
+ const DISTRIBUTION_DEFAULTS = {
41
+ /**
42
+ * Invalidate all paths by default so that deployed content is immediately
43
+ * visible through CloudFront. Uses a wildcard path which counts as a
44
+ * single invalidation path. For deployments that only change a subset of
45
+ * files, override with specific paths to reduce origin fetches.
46
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_withstand_component_failures_static_stability.html
47
+ */
48
+ distributionPaths: ["/*"],
49
+ };
50
+ /**
51
+ * Secure, AWS-recommended defaults applied to every S3 BucketDeployment
52
+ * built with {@link createBucketDeploymentBuilder}. Each property can be
53
+ * individually overridden via the builder's fluent API.
54
+ */
55
+ exports.BUCKET_DEPLOYMENT_DEFAULTS = {
56
+ ...BASE_DEFAULTS,
57
+ ...DISTRIBUTION_DEFAULTS,
58
+ };
59
+ /**
60
+ * Returns the appropriate defaults based on whether a CloudFront
61
+ * distribution is present. CDK throws if `distributionPaths` is set
62
+ * without a distribution, so distribution-specific defaults are only
63
+ * included when applicable.
64
+ */
65
+ function effectiveDefaults(hasDistribution) {
66
+ return hasDistribution ? { ...BASE_DEFAULTS, ...DISTRIBUTION_DEFAULTS } : BASE_DEFAULTS;
67
+ }
68
+ //# sourceMappingURL=bucket-deployment-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-deployment-defaults.js","sourceRoot":"","sources":["../../src/bucket-deployment-defaults.ts"],"names":[],"mappings":";;;AAmEA,8CAEC;AAnED;;;;GAIG;AACH,MAAM,aAAa,GAA0C;IAC3D;;;;;OAKG;IACH,KAAK,EAAE,IAAI;IAEX;;;;;;OAMG;IACH,WAAW,EAAE,GAAG;IAEhB;;;;;;;OAOG;IACH,cAAc,EAAE,KAAK;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAA0C;IACnE;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACU,QAAA,0BAA0B,GAAG;IACxC,GAAG,aAAa;IAChB,GAAG,qBAAqB;CACzB,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,eAAwB;IACxD,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,qBAAqB,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;AAC1F,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-deployment-props.d.ts","sourceRoot":"","sources":["../../src/bucket-deployment-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAEpF;;;;;;;;GAQG;AACH,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CACxD,qBAAqB,EACrB,SAAS,GAAG,mBAAmB,GAAG,cAAc,CACjD;IACC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=bucket-deployment-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket-deployment-props.js","sourceRoot":"","sources":["../../src/bucket-deployment-props.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAe9D;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,EAAE,aAAa,EAczD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yCAAyC,EAAE,aAAa,EAMpE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CA6DvD,CAAC"}